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

Sac*_*apa 11 oracle oracle10g

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

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

  1. 如果启用ROW_MOVEMENT,我们可以获得什么性能提升?
  2. 是否有启用ROW_MOVEMENT的缺点?
  3. 什么触发器的行动?oracle如何决定它需要移动ROWS?

任何帮助将受到高度赞赏.

提前致谢 !!

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中的常见行为.

  • @ora-600 是的,这些行可能会被物理移动,它可能会影响一个特别好的聚集索引读取。但是,文章中用于说明这一点的模式具有误导性:它将 16k 数据块数据库上的 40 行长度表与 4k 块数据库上的 404 行长度表进行比较。“启用行移动”没有理由修改表的平均行长度。它也不会影响块大小。所以“总阅读量”完全是误导。IMO 这个网站是众所周知的,因为它在搜索引擎中排名很好,而不是因为它的内容质量。 (3认同)
  • 启用行移动还有助于运行alter table shrink space,这在某些情况下可以允许在不重建的情况下减小表的大小. (2认同)
  • FLASHBACK 操作也需要行移动,这些操作将表倒带到较早的状态。 (2认同)

The*_*dow 5

另请参阅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 中可用的工具对于测量这种情况非常有用(查询随时间推移执行的工作量)


Kac*_*per 5

行移动的缺点是ROWIDs 可能会改变。因此,如果您有任何基于ROWID它们的查询,它们可能会返回错误的结果