我们使用的是 oracle 10G,如果我们查询/删除数据,其中一张表需要很多时间。该表包含大约 1000 万条记录。
最近我们发现 ROW_MOVEMENT 在这张表上被禁用了,我们想了解以下内容:
- 如果启用 ROW_MOVEMENT 我们可以获得什么性能提升?
- 启用 ROW_MOVEMENT 有什么缺点吗?
- 什么触发器的行运动?oracle 如何决定需要移动 ROWS ?
任何帮助将不胜感激。
提前致谢 !!
行移动主要应用于分区表。它允许跨分区移动行。禁用行移动(这是默认设置)后,您不能使用更新移动行:
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
例如。例如,这可能反过来影响索引集群因子,这可能会影响某些查询的性能。
默认情况下禁用行移动,因为这意味着rowid
行的 可能会更改,这不是 Oracle 中的常见行为。
行移动的缺点是ROWID
s 可能会改变。因此,如果您有任何基于ROWID
它们的查询可能会返回错误的结果
另请参阅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
关于收缩(需要行移动):
我建议进行基准测试——在执行操作之前和之后收集有关表的性能指标。您会期望完整扫描在之后更有效地运行,您会期望索引范围扫描保持不变或“更好”,因为每个块有更多的行打包在一起(更少的数据传播)。您会期待这种情况发生——statspack 或 dbconsole 中可用的工具将有助于衡量这一点(查询随时间执行的工作量)