随着表的增长合并成性能

时间:2018-08-05 08:21:31

标签: oracle oracle12c sql-merge full-table-scan

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

每日数据将加载到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?

如果使用CURSORUPDATEINSERT来完成此操作,那么我们可能会在适当的时候(例如处理50,000次后)引入ANALYZE TableA切换到最佳计划。

我找不到任何有关此特定问题的文档。

1 个答案:

答案 0 :(得分:0)

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

  1. 将表上的所有索引标记为“不可用”,将 标记为唯一索引。
  2. 插入所有记录
  3. 在插入时捕获DUPLICATE VALUE ON INDEX异常,并发出适当的UPDATE。
  4. 从输入记录中删除处理过的行。
  5. 每N条记录提交一次(1000?10000?100000?您选择......),为每个COMMIT之后插入的表调用DBMS_STATS.GATHER_TABLE_STATS

好运。