我有两个插入语句,几乎完全相同,它们在同一个Oracle实例上以两个不同的模式运行.insert语句看起来并不重要 - 我在这里寻找故障排除策略.
两种模式都有99%相同的结构.一些列的名称略有不同,除了它们是相同的.insert语句几乎完全相同.一个解释计划的成本为6,另一个的解释计划的成本为7.两个插入语句集中涉及的表具有完全相同的索引.已经为两个模式收集了统计数据.
一个insert语句在5秒内插入12,000条记录.
另一个insert语句在4分19秒内插入25,000条记录.
插入的记录数是正确的.执行时间的巨大差异让我感到困惑.鉴于解释计划中没有任何突出的问题,您将如何确定导致运行时间差异的原因?
(我在Windows机器上使用Oracle 10.2.0.4).
编辑:问题最终成为一个低效的查询计划,涉及笛卡尔合并,不需要这样做.明智地使用索引提示和散列连接提示解决了这个问题.现在需要10秒钟.Sql Trace/TKProf给了我方向,因为我向我展示了计划中每个步骤花了多少秒,以及生成了多少行.因此TKPROF告诉我: -
Rows Row Source Operation ------- --------------------------------------------------- 23690 NESTED LOOPS OUTER (cr=3310466 pr=17 pw=0 time=174881374 us) 23690 NESTED LOOPS (cr=3310464 pr=17 pw=0 time=174478629 us) 2160900 MERGE JOIN CARTESIAN (cr=102 pr=0 pw=0 time=6491451 us) 1470 TABLE ACCESS BY INDEX ROWID TBL1 (cr=57 pr=0 pw=0 time=23978 us) 8820 INDEX RANGE SCAN XIF5TBL1 (cr=16 pr=0 pw=0 time=8859 us)(object id 272041) 2160900 BUFFER SORT (cr=45 pr=0 pw=0 time=4334777 us) 1470 TABLE ACCESS BY INDEX ROWID TBL1 (cr=45 pr=0 pw=0 time=2956 us) 8820 INDEX RANGE SCAN XIF5TBL1 (cr=10 pr=0 pw=0 time=8830 us)(object id 272041) 23690 MAT_VIEW ACCESS BY INDEX ROWID TBL2 (cr=3310362 pr=17 pw=0 time=235116546 us) 96565 INDEX RANGE SCAN XPK_TBL2 (cr=3219374 pr=3 pw=0 time=217869652 us)(object id 272084) 0 TABLE ACCESS BY INDEX ROWID TBL3 (cr=2 pr=0 pw=0 time=293390 us) 0 INDEX RANGE SCAN XIF1TBL3 (cr=2 pr=0 pw=0 time=180345 us)(object id 271983)
请注意操作为MERGE JOIN CARTESIAN和BUFFER SORT的行.让我看到这一点的是生成的行数(超过200万!),以及每次操作花费的时间(与其他操作相比).