oracle文档says在更改索引条款shrink space compact
和coalesce
期间非常相似,可以互相替换,但Tom found在行为。
由于合并版在Oracle数据库的标准版中不可用,我认为使用它有一些好处。
那么,有什么区别?我可以对动态变化的索引执行shrink space compact
吗?
答案 0 :(得分:4)
上述答案是错误的。基本上有4种选择。
1 - ALTER INDEX COALESCE
2 - ALTER INDEX SHRINK SPACE
3 - ALTER INDEX SHRINK SPACE COMPACT
4 - ALTER INDEX REBUILD
选项1和3不会释放块。他们只是释放现有街区的空间。 Coalesce的工作稍差一点,会有更多的块只有25-50%的可用空间,而收缩空间紧凑,会有更多的块有75-100%的可用空间。但是,块的总数保持不变。例如,一个200块具有合并的索引,并且在随机删除1/5行之后,将有~1 / 5的索引块具有25-50%的可用空间,而其余的则保持满。
另一方面,缩小空间和重建会释放块,并将它们合并到现有块中,从而减少块的总数。我认为唯一的区别是速度。当您从大表中仅删除5%时,没有理由重建整个索引,并且它将非常慢。但是,缩小空间在这里可能会快一点,因为它不会重建整个索引,只是重新组织块。
显然,最快的选择是通过紧凑选项来合并或缩小空间。
答案 1 :(得分:1)
首先,索引通常不需要经常重建。它们通常会增长到稳定的大小并保持在那里,并且重建它们只会对查询产生暂时的好处,然后由于块分割率的增加而增加的修改负载会抵消这些查询。因此,不要忘记,流程的最佳优化是完全消除它 - 如果您认为需要频繁重建然后发布问题,可能会解释原因并找到不同的方法。
无论如何,coalesce减少了保存索引数据的块数,从而完全释放块,以便可以将它们重新用于新的索引条目。但是,释放的块仍然分配给索引。这可以防止索引变得太大。
Shrink做了类似的事情,但移动填充的块以允许从索引段的“结尾”释放的块从其中释放。因此,索引段实际上变小了。这需要在桌面上进行独占锁定。