15

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

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

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

任何帮助将不胜感激。

提前致谢 !!

4

3 回答 3

18

行移动主要应用于分区表。它允许跨分区移动行。禁用行移动(这是默认设置)后,您不能使用更新移动行:

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

于 2013-10-17T15:05:52.623 回答
5

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

于 2018-02-12T13:22:40.557 回答
4

另请参阅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 中可用的工具将有助于衡量这一点(查询随时间执行的工作量)

于 2017-10-13T07:36:11.657 回答