database - 我如何知道 Oracle 中的表是否存在碎片?

标签 database oracle database-fragmentation

我有一张 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/

相关文章:

database - 需要字典数据库

oracle - SQL加载程序错误: "Variable length field exceeds maximum length."

database - DDBMS 中的主要水平碎片 - 简单谓词的完整性

oracle - 使用闪存盘存储还需要担心行碎片吗?

sql - ORA-00942 : table or view does not exist ( on another schema on same DB )

database - 一对多与多对多关系

sql - 选择常量作为伪列并对伪列进行算术运算

database - 使用 Delphi 进行数据库开发的最佳实践是什么?

c++ - 如何检测 Oracle 断开/停止的连接?