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

1.背景

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

如下图:

1949f9d4df52bb9d1881a73737000c42.png

使用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%'复制代码

结果如下

bc50c0bbd12ac69e2f7a7752f5767a60.png

2.4 根据SQL ID查出执行计划select * from table(dbms_xplan.display_cursor('3ayyrp8bkzmb6',null,'allstats last'));复制代码

效果如下,

248eb0600b72e3ddacf31fe477fb3f58.png

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

992f7b6b98d8f7b3641d6bcad48f06a0.png

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

4bf83509e6cf60853963b2a764e4e61c.png

可以看到多了A-Rows、A-Time等字段。Starts 表示这个操作执行的次数

E-Rows表示优化器估算的行数,就是普通执行计划中的Rows

A-Rows表示真实的行数

A-Time表示累加的总时间。与普通执行计划不同的是,普通执行计划中的Time是假的,而A-Time是真实的。

Buffers表示累加的逻辑读

Reads表示累加的物理读

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值