当前位置:  开发笔记 > 数据库 > 正文

如何解决Oracle SQL语句的性能问题

如何解决《如何解决OracleSQL语句的性能问题》经验,为你挑选了0个好方法。

我有两个插入语句,几乎完全相同,它们在同一个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万!),以及每次操作花费的时间(与其他操作相比).

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有