1

MERGE INTO这是关于 Oracle RDBMS 12c 上具有特定场景的 Oracle 语句的一般问题。

每日数据将被加载到StagingTableA- 大约 10m 行。这将是MERGEd INTO TableATableA将在 0 到 10m 行之间变化(匹配StagingTableA)。有时可能TableA会被修剪/清空并留下 0 行。

显然,当TableA为空时,直行INSERT将完成这项工作,但程序已被编写为使用一种MERGE INTO方法来处理所有场景。

位于MERGE .. MATCH索引列上。

我的问题是不确定如何MERGE处理将开始为空MATCH的情况TableA,然后在MERGE执行期间大幅增长。索引列将MATCH使用 FTS,因为统计信息将显示该表有 0 行。

MERGE交易过程中的某个时刻,这将变得低效。

MERGE语句是否足够聪明,可以检测到这一点并更改执行计划,并开始使用索引而不是 FTS?

如果这是用旧方式完成的,CURSOR那么我们可能会在适当的点(比如在处理 50,000 次之后)引入 a以切换到最佳计划。UPDATEINSERTANALYZETableA

我找不到任何处理这个特定问题的文档。

4

1 回答 1

0

希望您在该表上有一个基于传入数据的唯一索引。如果我是你,而不是使用简单的 MERGE,我会:

  1. 将表上的所有索引标记为 UNUSABLE,唯一索引除外
  2. 插入所有记录
  3. 在 INSERT 时捕获DUPLICATE VALUE ON INDEX异常并发出相应的 UPDATE。
  4. 从输入记录中删除已处理的行。
  5. 提交每 N 条记录(1000 条?10000 条?100000 条?你的选择......),DBMS_STATS.GATHER_TABLE_STATS在每次提交后调用你插入的表。

祝你好运。

于 2018-08-05T20:26:06.683 回答