我们正在使用oracle 10G,如果查询/删除数据,其中一个表需要大量时间。该表包含大约1000万条记录。
最近我们发现在这个表上禁用了ROW_MOVEMENT,我们想了解以下内容:
任何帮助都将受到高度赞赏。
提前致谢!!
答案 0 :(得分:12)
行移动主要是applied to partition tables。它允许行跨分区移动。禁用行移动(默认情况下)时,无法使用更新移动行:
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
当您允许行移动时,您可以使用更新移动行:
SQL> ALTER TABLE part_table ENABLE ROW MOVEMENT;
Table altered
SQL> UPDATE part_table SET ID = 2;
1 row updated
在大多数情况下,此功能不会影响性能:无论是否启用该功能,都会以完全相同的方式存储和查询行。但是,当启用行移动时,可以使用ALTER TABLE SHRINK SPACE
来物理移动行(类似于delete + insert)。 此可能反过来影响索引群集因素,这可能会影响某些查询的效果。
默认情况下禁用行移动,因为它意味着行的rowid
可能会发生变化,这不是Oracle中的常见行为。
答案 1 :(得分:2)
另见http://www.dba-oracle.com/t_callan_oracle_row_movement.htm
以下操作需要ROW MOVEMENT:
回答您的问题:如果启用行移动,性能不会提高,但您可以缩小表格,从而提高全表查询的性能。
ASKTOM也为您的问题提供了非常好的答案:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:35203106066718
关于收缩(需要ROW MOVEMENT):
我建议进行基准测试 - 收集有关的性能指标 在执行操作之前和之后的表。你会期望满满的 扫描后更有效地运行,你会期望索引范围 扫描要么保持不变,要么“更好”,因为每行有更多行 块打包在一起(数据传播较少)。你会寻找 要发生的事情 - statspack或dbconsole中可用的工具会 有用的测量(你的工作量) 随着时间的推移查询)
答案 2 :(得分:2)
行移动的缺点是ROWID
s可能会改变。因此,如果您有任何基于ROWID
的疑问,则可能会返回错误的结果