page contents

Oracle 性能优化技巧-获取真实执行计划

在sql优化时候,我们经常采用执行计划,例如用navicat或plsql的解释计划,其实出来的结果只是一个预估值,所以会造成测试环境执行很快,到生产环境慢的情况。

attachments-2021-01-I1uArgqy5ff52bfab7b1a.png


1.背景

在sql优化时候,我们经常采用执行计划,例如用navicat或plsql的解释计划,其实出来的结果只是一个预估值,所以会造成测试环境执行很快,到生产环境慢的情况。

如下图:

attachments-2021-01-XYiNgkhz5ff52d0b15113.jpg

使用AUTOTRACE或者EXPLAIN PLAN FOR 获取的执行计划来自于PLAN_TABLE。PLAN_TABLE是一个会话级的临时表,里面的执行计划并不是SQL真实的执行计划,它只是优化器估算出来的。

真实的执行计划不应该是估算的,应该是真正执行过的。SQL执行过的执行计划存在于共享池中,具体存在于数据字典VS Q L P L A N 中 , 带 有 A − T i m e 的 执 行 计 划 来 自 于 V SQL_PLAN中,带有A-Time的执行计划来自于VSQLPLAN中,带有A−Time的执行计划来自于VSQL_PLAN,是真实的执行计划,而通过AUTOTRACE、通过EXPLAIN PLAN FOR获取的执行计划只是优化器估算获得的执行计划。(注1)


2.那么怎么获取真实执行计划?

首先要有访问动态性能视图的权限,可用以下语句授权

grant select any dictionary to QAS_R_BIZ;

有了权限之后,分以下几步走(超级管理员不用)

2.1执行下面语句

alter session set statistics_level = all;

(这一步对当前会话窗口有效,可以不做,下面解释)

2.2执行要优化的sql;

select  /* gather_plan_statistics */ R.RU_ID   AS ruId,
 R.MU_ID   AS muId,
 R.RU_NAME AS ruShortName,
 D.YW_DM   AS YWDM,
 D.yws     AS YWDMCOUNT
 from T_REGIONAL_UNIT r
 LEFT JOIN T_MANAGE_UNIT m
 on r.MU_ID = m.MU_ID
 left join (select YW_DM, sum(YW_DM_COUNT) as yws, SWJGDM
 from T_DAILY_SELF_SERVICE_HALL_YWS
 where SNAPSHOT_DATE between
 TO_DATE('2020-01-14 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
 TO_DATE('2020-12-14 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
 group by YW_DM, SWJGDM) D
 on m.MU_CODE = D.SWJGDM
 where 1 = 1
 and r.parent_ID = 10000
 order by r.display_index, D.YW_DM

如果上一步不做,则需要在语句中添加/+ gather_plan_statistics 

2.3 找出执行语句的SQL ID,例如:

select * from v$sql where sql_text like '%gather_plan_statistics%'

结果如下

attachments-2021-01-cLJcltea5ff52d178f814.jpg

2.4 根据SQL ID查出执行计划

select * from table(dbms_xplan.display_cursor('3ayyrp8bkzmb6',null,'allstats last'));

效果如下,

attachments-2021-01-aDDef2AL5ff52d20b5462.jpg

复制出来贴到notepad++,为了展示出全部查询结果记得点击获取最后一页按钮,点击左上角全选。

attachments-2021-01-08Ru9nhs5ff52d29aa4bf.jpg

粘贴到记事本或notepad++ 效果如下

attachments-2021-01-xzlOFnHR5ff52d31bf2b7.jpg

可以看到多了A-Rows、A-Time等字段。

  • Starts 表示这个操作执行的次数
  • E-Rows表示优化器估算的行数,就是普通执行计划中的Rows
  • A-Rows表示真实的行数
  • A-Time表示累加的总时间。与普通执行计划不同的是,普通执行计划中的Time是假的,而A-Time是真实的。
  • Buffers表示累加的逻辑读
  • Reads表示累加的物理读

真实执行计划提供了SQL执行的真实信息,包括A-Time(真实时间)、A-Rows(真实行数)、Starts(步骤执行次数)等,对于非数据库开发人员来说,十分直观方便。


attachments-2021-01-vDFmD5sF5ff52d3c1d0c4.jpg

原文:https://blog.csdn.net/huangmingleiluo/article/details/112093367?utm_medium=distribute.pc_category.none-task-blog-hot-6.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-6.nonecase

  • 发表于 2021-01-06 11:18
  • 阅读 ( 493 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1320 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章