我们正在使用oracle 10G,如果我们查询/删除数据,其中一个表需要很多时间.该表包含大约1000万条记录.
最近我们发现在这个表上禁用了ROW_MOVEMENT,我们想了解以下内容:
任何帮助将受到高度赞赏.
提前致谢 !!
Vin*_*rat 13
行移动主要应用于分区表.它允许行跨分区移动.禁用行移动(默认情况下)时,无法移动具有更新的行:
SQL> CREATE TABLE part_table (ID NUMBER)
2 PARTITION BY RANGE (ID)
3 (PARTITION p0 VALUES LESS THAN (1),
4 PARTITION p1 VALUES LESS THAN (MAXVALUE));
Table created
SQL> INSERT INTO part_table VALUES (0);
1 row inserted
SQL> UPDATE part_table SET ID = 2;
UPDATE part_table SET ID = 2
ORA-14402: updating partition key column would cause a partition change
Run Code Online (Sandbox Code Playgroud)
允许行移动时,可以使用更新移动行:
SQL> ALTER TABLE part_table ENABLE ROW MOVEMENT;
Table altered
SQL> UPDATE part_table SET ID = 2;
1 row updated
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,此功能不会影响性能:无论是否启用该功能,都会以完全相同的方式存储和查询行.但是,当启用行移动时,可以物理移动行(例如,类似于删除+插入)ALTER TABLE SHRINK SPACE
.这可能反过来影响索引集群因素,这可能会影响某些查询的性能.
默认情况下禁用行移动,因为它意味着rowid
行的行可能会更改,这不是Oracle中的常见行为.
另请参阅http://www.dba-oracle.com/t_callan_oracle_row_movement.htm
以下操作需要 ROW MOVMENT:
回答您的问题:如果启用行移动,性能不会提高,但您可以缩小表,这会提高全表查询的性能。
ASKTOM也对你的问题给出了很好的答案:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:35203106066718
关于Shrink(需要ROW MOVMENT):
我建议进行基准测试——在执行操作之前和之后收集有关表的性能指标。您会期望完整扫描能够更有效地运行,之后您会期望索引范围扫描保持不变或“更好”,因为每个块有更多行打包在一起(数据传播更少)。您会希望这种情况发生——statspack 或 dbconsole 中可用的工具对于测量这种情况非常有用(查询随时间推移执行的工作量)