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

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

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

1.背景

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

如下图:


0.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的执行计划来自于VSQL  LAN中,带有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%' order by last_active_time desc

结果如下

1.png


2.4 根据SQL ID查出执行计划

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

效果如下,

2.png


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


3.png


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

4.png


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


Starts 表示这个操作执行的次数

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

A-Rows表示真实的行数

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

Buffers表示累加的逻辑读

Reads表示累加的物理读


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


相关文章
|
7月前
|
存储 Oracle 关系型数据库
9-3 Oracle数据字典和动态性能视图介绍
9-3 Oracle数据字典和动态性能视图介绍
|
4月前
|
SQL Oracle 关系型数据库
Oracle-动态性能视图解读
Oracle-动态性能视图解读
88 0
|
10月前
|
存储 SQL 负载均衡
达梦数据库与Oracle数据库:功能、性能和适用场景对比
数据库在现代信息技术领域中扮演着至关重要的角色。在企业级应用中,选择正确的数据库管理系统对于数据存储、处理和查询效率至关重要。本文将对比两个备受关注的数据库管理系统——达梦数据库和Oracle数据库,从功能、性能和适用场景等方面进行深入探讨,以帮助读者在选择合适数据库时做出明智的决策。
2167 1
|
11月前
|
SQL 缓存 监控
Oracle中如何生成有用的SQL 执行计划(译)
漫画戴夫·艾伦(Dave Allen)曾经讲过一个古老的笑话,一个旅行者问路人去某个城镇的路,路人只是说:“如果我是你,我就不会从这里开始。”
119 0
|
11月前
|
SQL 存储 缓存
获取和解读Oracle中SQL的执行计划(译文)
生成和显示 SQL 语句的执行计划是大多数 DBA、SQL 开发人员和性能专家的常见任务,因为它提供了 SQL 语句执行性能相关的信息。执行计划显示执行 SQL 语句的详细步骤,这些步骤表示为一组使用和生成行的数据库运算符。运算符的顺序和实现由查询优化器根据查询转换和物理优化技术来决定。
203 0
|
12月前
|
Oracle 前端开发 关系型数据库
使用隐含参数_disable_logging分析oracle写redo logfile的性能
oracle有一个隐含参数_disable_logging可以禁止日志的生成,这个参数当然不能在生产库使用,但我们可以将其因为与测试,例如,如果我们怀疑数据库写redo logfile存在性能问题,我们可以将这个参数设置为true,禁止写日志,看看oracle的性能提高了多少。
|
12月前
|
SQL Oracle 关系型数据库
Oracle优化05-执行计划
Oracle优化05-执行计划
407 0
|
12月前
|
SQL Oracle 安全
Oracle优化01-引起数据库性能问题的因素
Oracle优化01-引起数据库性能问题的因素
134 0
|
SQL Oracle 网络协议
【.NET 6】使用EF Core 访问Oracle+Mysql+PostgreSQL并进行简单增改操作与性能比较
唠嗑一下。都在说去O或者开源,但是对于数据库选型来说,很多人却存在着误区。例如,去O,狭义上讲,是去Oracle数据库。但是从广义上来说,是去Oracle公司产品或者具有漂亮国垄断地位和需要商业授权的数据库产品。
328 0
【.NET 6】使用EF Core 访问Oracle+Mysql+PostgreSQL并进行简单增改操作与性能比较