【发布时间】:2010-09-11 08:52:24
【问题描述】:
我有两个几乎完全相同的插入语句,它们在同一个 Oracle 实例上的两个不同模式中运行。插入语句是什么样的并不重要——我在这里寻找故障排除策略。
两种模式 99% 的结构相同。一些列的名称略有不同,除了它们是相同的。插入语句几乎完全相同。一个解释计划的成本为 6,另一个解释计划的成本为 7。两组插入语句中涉及的表具有完全相同的索引。两种模式的统计信息都已收集。
一个插入语句在 5 秒内插入 12,000 条记录。
另一个插入语句在 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 万!),以及每个操作花费的时间(与其他操作相比)。
【问题讨论】:
-
一朵云和一个西瓜有 99% 相同——水……并不意味着它们是等价的。我可以有两个针对页面的巨大查询并将 = 更改为 != 并且可以完全改变性能。
-
标记 - 插入语句位于两个不同的模式中,具有完全相同的表,有一些列的名称不同。数据类型相同。插入语句使用相同的表、相同的连接策略等。
标签: database performance oracle