在 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_fromvalid_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 变成 deleteinsert 这将显着增加成本(多少取决于重做生成的成本和生成的重做的多少)由两个操作)。正如 中所建议的那样,在 valid_from 上进行分区通常似乎更有意义,因为它是一个静态的 NOT NULL 列。这使您不必为当前行分配假的 valid_to 值。不过,如果您唯一关心的是此 merge 语句的性能,而不是针对此 table 的所有其他查询,那么在 valid_to 上进行分区可能对您有意义。