在 Oracle 19 中启用 ROW_MOVEMENT?
enabling ROW_MOVEMENT in Oracle 19?
我有 table TRD_TEST2
,我在其中创建了以下分区以提高性能,因为 table 有 8000 万条记录:
PARTITION BY RANGE(valid_to)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
( PARTITION p0 VALUES LESS THAN (TO_DATE('01-01-3999', 'DD-MM-YYYY')))
ENABLE ROW MOVEMENT;
出于历史目的,我们在 TRD_TEST2
table 中创建了技术关键列 valid_from
和 valid_to
。以下是我们每天 运行 的 Merge
查询:
MERGE INTO TRD_TEST2 e
USING TRD_TEST2_SRC h
ON (e.ld= h.ld)
WHEN MATCHED THEN
UPDATE SET e.valid_to = sysdate,
IS_CURRENT = 0
where e.valid_to = TO_DATE('01.01.3999', 'DD.MM.YYYY');
我想知道在这种情况下启用 ENABLE ROW MOVEMENT
是否有意义,因为我们每天使用上述 Merge
查询更新 valid_to
列,有什么影响?
我不确定这个问题是否有意义。
如果您在 valid_to
上进行分区并更新 valid_to
,那么您必须启用行移动。如果您不启用行移动,一旦您尝试以强制将其放入不同分区的方式更新行,您就会收到错误消息。
通常不赞成选择预期会更改的分区键。移动一行有效地将 update
变成 delete
和 insert
这将显着增加成本(多少取决于重做生成的成本和生成的重做的多少)由两个操作)。正如 中所建议的那样,在 valid_from
上进行分区通常似乎更有意义,因为它是一个静态的 NOT NULL
列。这使您不必为当前行分配假的 valid_to
值。不过,如果您唯一关心的是此 merge
语句的性能,而不是针对此 table 的所有其他查询,那么在 valid_to
上进行分区可能对您有意义。
我有 table TRD_TEST2
,我在其中创建了以下分区以提高性能,因为 table 有 8000 万条记录:
PARTITION BY RANGE(valid_to)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
( PARTITION p0 VALUES LESS THAN (TO_DATE('01-01-3999', 'DD-MM-YYYY')))
ENABLE ROW MOVEMENT;
出于历史目的,我们在 TRD_TEST2
table 中创建了技术关键列 valid_from
和 valid_to
。以下是我们每天 运行 的 Merge
查询:
MERGE INTO TRD_TEST2 e
USING TRD_TEST2_SRC h
ON (e.ld= h.ld)
WHEN MATCHED THEN
UPDATE SET e.valid_to = sysdate,
IS_CURRENT = 0
where e.valid_to = TO_DATE('01.01.3999', 'DD.MM.YYYY');
我想知道在这种情况下启用 ENABLE ROW MOVEMENT
是否有意义,因为我们每天使用上述 Merge
查询更新 valid_to
列,有什么影响?
我不确定这个问题是否有意义。
如果您在 valid_to
上进行分区并更新 valid_to
,那么您必须启用行移动。如果您不启用行移动,一旦您尝试以强制将其放入不同分区的方式更新行,您就会收到错误消息。
通常不赞成选择预期会更改的分区键。移动一行有效地将 update
变成 delete
和 insert
这将显着增加成本(多少取决于重做生成的成本和生成的重做的多少)由两个操作)。正如 valid_from
上进行分区通常似乎更有意义,因为它是一个静态的 NOT NULL
列。这使您不必为当前行分配假的 valid_to
值。不过,如果您唯一关心的是此 merge
语句的性能,而不是针对此 table 的所有其他查询,那么在 valid_to
上进行分区可能对您有意义。