【发布时间】: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