【问题标题】:Is partitioning necessary for LOB columns?LOB 列是否需要分区?
【发布时间】:2014-08-04 17:16:55
【问题描述】:

我的老板担心,如果我们不对表进行分区并随着时间的推移删除分区(而不是仅仅删除记录),那么在我们的数据库表中创建 LOB 列可能会导致有效的永久存储开销。他认为LOB的数据会在创建记录的时候单独存储,这似乎是正确的,但是Oracle可能不会在删除行时删除LOB列的数据。

这是正确的还是可能的?我很难相信 DBMS 会如此糟糕地处理对象存储。如果有任何改变,我们将使用 Oracle 11g。

【问题讨论】:

  • 从阅读 here 开始。请注意,较小的 lob(~4k 字节或更小)通常是内联存储的。它的存储/维护方式当然取决于您的设置和数据。
  • 我已经看过这个页面,只是再次浏览了一遍,我没有看到太多关于如何/何时删除离线 LOB 的信息。不过,我可能忽略/错过了它。您认为是否有特定的部分涵盖了这一点?
  • 好吧,如果 lob 存储在行外(在单独的段中,将在 user_segments 中显示为 LOBSEGMENT 类型),则从表中删除不会释放范围。空间已经存在并且可用,但仍将被分配。
  • 为什么不释放数据?正如 ntalbs 所暗示的,这似乎是资源泄漏。这更多的是物理空间还是逻辑空间问题(例如,从硬盘驱动器中删除文件实际上只是删除了对它的引用,而不是数据本身)还是 Oracle 实际上挂在 LOB 上?该空间会被重新用于存储新数据吗?
  • 分配的范围将保留在表中,直到它被删除或截断。但是,该空间可免费用于该表的未来数据。我认为您的老板想要对表进行分区,以便他可以删除/截断分区,“释放”其他表/对象的空间。我认为只要分区对数据及其维护方式有意义就可以了(不过,我不会仅仅因为这个原因而强制适应某些分区方案)。

标签: oracle database-partitioning lob


【解决方案1】:

我最终找到了涵盖相同主题的this ask tom question

当数据库创建一个区来存储 LOB 时,它直接与表相关联。当删除包含这些 LOB 的行时,这些 LOB 将从保持相同大小的范围中删除(它不会因为 LOB 被删除而缩小)。但是,该表能够像预期的那样重用已删除 LOB 中的空间。

因此,虽然整个数据库无法重用为表的 LOB 存储创建的扩展区中的空闲空间,但该空间仍可供表使用。在删除或截断表之前,该范围将一直存在(因此会占用数据库完全可用的空间),或者该范围被显式释放。

最后,除非剩余分配给表的范围是一个问题(或者还有其他问题可以通过分区解决),否则没有必要仅为此目的创建分区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多