我有一张 table ,它似乎占用了比实际需要更多的空间。有人建议我将数据复制到新表并重命名新表和旧表以交换它们。如何确认当前表是否实际上是碎片化的?如何估计或计算包含相同数据的新表的新大小?
最佳答案
如果您的统计数据是最新的,那么如果表中的 block 比行数据量所建议的多得多,这应该会给出一个不错的指示。
select table_name, round((num_rows * avg_row_len) /(8*1024)), blocks
from user_tables where ....
此空间将用于将来的插入,因此不一定是问题。如果您进行了大量归档或删除数据,可能值得回收空间(尤其是在进行大量全表扫描时)。 [注意:我假设 8k block ,这是默认值。]
如果您执行 CREATE/DROP/RENAME,您将丢失所有索引、约束、授权(如果您使用它们,还有表注释)。
您最好检查当前表空间(查看 USER_SEGMENTS)并执行 ALTER TABLE tablename MOVE current_tablespace;
之后您还需要重建索引。从 USER_INDEXES 中选择它们并执行 ALTER INDEX ... REBUILD;
关于database - 我如何知道 Oracle 中的表是否存在碎片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6342540/