关于执行计划Cost的三个疑问:

1. 执行计划的Cost越低,SQL就一定跑得越快吗?或者说Cost 和 执行时间成比例关系吗?

2. Oracle 默认产生的执行计划是Cost最低的吗?

3. 如果对象的统计信息都是最新的,执行计划就一定是准确和最优的吗?

实践出真知:

发现一条SQL,跑很久也没结果出来。

SQL不是很长,但是执行计划很长。

SQL文本:

SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd') AS STAT_DATE,
SYSDATE AS STAT_TIME,
X.TABLE_NAME,
NVL(X.NUM_ROWS, 0) AS TABLE_ROWS,
NVL(ROUND(X.NUM_ROWS * X.AVG_ROW_LEN / 1024, 2), 0) AS TABLE_SIZES,
Y.CREATED AS CREATE_TIME,
Z.COMMENTS AS TABLE_COMMENT,
H .COL_CNT
FROM ALL_TABLES X,
ALL_OBJECTS Y,
ALL_TAB_COMMENTS Z,
(SELECT H .TABLE_NAME, COUNT(1) AS COL_CNT
FROM ALL_TAB_COLS H
WHERE H.OWNER = 'TOSSKA'
GROUP BY H .TABLE_NAME) H
WHERE X.TABLE_NAME = Y.OBJECT_NAME
AND X.TABLE_NAME(+) = Z.TABLE_NAME
AND X.TABLE_NAME = H.TABLE_NAME
AND Y.OBJECT_TYPE IN ('TABLE PARTITION', 'TABLE')
AND X. OWNER = 'TOSSKA'
AND Y. OWNER = 'TOSSKA'
AND Z. OWNER = 'TOSSKA'
ORDER BY X.TABLE_NAME

执行计划:

执行计划有214个步骤。太长了影响阅读,这里只显示小部分执行计划,大约十分之一吧。

在 Tosska SQL Tuning Expert for Oracle 中输入SQL,点击Tune开始自动优化。

一边喝咖啡, 一边等待…

优化结束后,工具帮我找到了5条更快的等价SQL.

有兴趣的朋友,可以将SQL中的OWNER从TOSSKA改为自己数据库上的用户名(用户下要有大量的表,否则SQL没有返回结果集,看不出效果),亲自试一试。

让我们来分析下6条SQL(原SQL,5条优化后更快的SQL) 执行计划Cost和性能之间的关系。

下图可以看出来,Cost和SQL执行时间并不成比例关系。

仔细观察原SQL和优化后的SQL,我们来回答博客开头提出的三个问题。

  1. SQL 127 和 SQL 129 的Cost比原始SQL高很多,大约是原始SQL的3倍,但是速度却比原始SQL快很多。换句话说,Cost只是估计值,和真实的速度没有直接关系。
  2. 原始SQL的Cost是1330, 等价SQL 130, SQL 135 和 SQL 45的Cost 都比原始SQL低。然而Oracle并没有选中这些Cost更低的执行计划。 换句话说,Cost低的执行计划漏选了。Oracle并没有错,SQL优化器不能遍历所有执行计划,然后找出Cost最低的执行计划;否则寻找Cost最低的执行计划所耗费的时间,可能会超过SQL执行所需要的时间, 得不偿失。
  3. CBO 是基于对象的统计信息,根据一堆公式估算执行计划成本和返回行数的,难免会出现误差;当误差级联放大之后,就可能导致产生次优或者不好的执行计划;这也是Oracle推出Adaptive Plan的一个原因;

Oracle是目前最强大的数据库,但是优化潜力依然巨大, 这也是众多SQL优化专家和优化工具的价值所在。

感受SQL优化工具的魅力,分享SQL优化故事…

SQL 优化工具下载:

https://www.tosska.cn/tosska-sql-tuning-expert-tse-oracle-free-download-zh/

SQL执行计划Cost与性能之间的的关系的更多相关文章

  1. SQL Server实际执行计划COST"欺骗"案例

    有个系统,昨天Support人员发布了相关升级脚本后,今天发现系统中有个功能不能正常使用了,直接报超时了(Timeout expired)的错误.定位到相关相关存储过程后,然后在优化分析的过程中,又遇 ...

  2. OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  3. Oracle sql执行计划解析

    Oracle sql执行计划解析 https://blog.csdn.net/xybelieve1990/article/details/50562963 Oracle优化器 Oracle的优化器共有 ...

  4. Atitit sql执行计划

    Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...

  5. Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全

    该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...

  6. Oracle查看SQL执行计划的方式

    Oracle查看SQL执行计划的方式     获取Oracle sql执行计划并查看执行计划,是掌握和判断数据库性能的基本技巧.下面案例介绍了多种查看sql执行计划的方式:   基本有以下几种方式: ...

  7. 替换SQL执行计划

    Switching two different SQL Plan with SQL Profile in Oracle... 当SQL是业务系统动态生成的,或者是第三方系统产生的,在数据库层面分析发现 ...

  8. [转载]循规蹈矩:快速读懂SQL执行计划的套路与工具

    作者介绍 梁敬彬,福富研究院副理事长.公司唯一四星级内训师,国内一线知名数据库专家,在数据库优化和培训领域有着丰富的经验.多次应邀担任国内外数据库大会的演讲嘉宾,在业界有着广泛的影响力.著有多本畅销书 ...

  9. sql_profile 固定SQL执行计划

    使用 sql_profile 固定SQL执行计划 Table of Contents 1. 扯蛋 2. 利用SQL PROFILE固定执行计划 2.1. 查看原来语句的执行计划 2.2. 指定SQL使 ...

随机推荐

  1. 清除样式的css

    html, body, div, ul, li, h1, h2, h3, h4, h5, h6, p, dl, dt, dd, ol, form, input, textarea, th, td, s ...

  2. jmeter设置代理

    JMeter设置Http代理对web或者app进行录制 一.录制web 1.首先保证JMeter的安装环境都正确.启动JMeter:在安装路径的bin目录下双击jmeter.bat (例如:D:\ap ...

  3. css 始终显示滚动条,内容超出显示有滑块的滚动条,内容没有超出显示空的滚动条

    1.内容没有超出显示空的滚动条 <div class="div1"> 前端开发者前端开发者前端开发者前端开发者前端开发者 </div> css代码: .di ...

  4. c++ 链接mysql:error LNK2019: 无法解析的外部符号

    使用VS2012编译项目报错如下: error LNK2019: 无法解析的外部符号 _mysql_real_connect@32,该符号在函数 _main 中被引用 error LNK2019: 无 ...

  5. Leetcode476.Number Complement数字的补数

    给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位. 示例 1: 输入: 5 输出: 2 解释: 5的二 ...

  6. SSM4-Linux上jdk、tomcat、zookeeper------tar zxvf的安装

    1.zookeeper .Zookeeper介绍 官方推荐使用zookeeper注册中心. 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发 ...

  7. 点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决?

    点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决? window.open("page1.html","win1"); 这句 ...

  8. Ajax 用法简介

    使用Ajax实现页面的局部刷新 一.不依赖jquery时是这样的用法: var xhr=new XMLHttpRequest(); xhr.onreadystatechange=function(ev ...

  9. 为GitLab配置邮件服务

    修改配置文件:/etc/gitlab/gitlab.rb ####################################################################### ...

  10. JAVA短信验证码 工具类

    MsgCodeUtil.java package com.hg.util; import com.soyea.enums.ResultEnum; import com.soyea.exception. ...