在Oracle 10g中启用/禁用ROW_MOVEMENT有什么影响?

时间:2013-10-17 14:54:54

标签: oracle oracle10g

我们正在使用oracle 10G,如果查询/删除数据,其中一个表需要大量时间。该表包含大约1000万条记录。

最近我们发现在这个表上禁用了ROW_MOVEMENT,我们想了解以下内容:

  1. 如果启用ROW_MOVEMENT,我们可以获得什么性能提升?
  2. 启用ROW_MOVEMENT是否有任何缺点?
  3. 什么触发器的行动? oracle如何决定是否需要移动ROWS?
  4. 任何帮助都将受到高度赞赏。

    提前致谢!!

3 个答案:

答案 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的疑问,则可能会返回错误的结果