关于执行计划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. 深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题[转]

    主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的一点 ...

  2. R语言画图教程之盒形图

    R语言画图教程之盒形图 我们之前有分享过一系列的R语言画图代码(PCA图.Pathway图.火山图.RDA图.热图),今天再来补充一个盒形图(箱形图)的代码. 以下代码只是示例,不能直接搬来用哦,注意 ...

  3. idea中 ClassNotFoundException报错问题

    1.首先你要明确 你少了哪个包(哪个包报错 ) 2.比如一个第三方的包,你明明导入了 idea导包方法:        明明导入成功了,但是报错. 3.其实并没有结束..... 一定要把右边的 双击 ...

  4. MFC 双缓存绘图

    在SDI应用程序中,当我们需要时刻动态刷新界面的时候,如果我们一直使用,UpdateAllView()那么就会出现屏幕不停闪烁.闪屏非常严重,特别是一直在动态刷新的时候.并且在闪屏的过程中 我们根本就 ...

  5. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  6. 跟我一起做一个vue的小项目(六)

    接下来我们编写周末游组件 <template> <div> <div class="recommend-title">周末去哪儿</div ...

  7. Highcharts 饼图数值显示在图形上

    1.引用js文件 <script type="text/javascript" src="http://cdn.hcharts.cn/jquery/jquery-1 ...

  8. Java review-basic2

    1.Implement a thread-safe (blocking) queue: Class Producer implements Runable{ Private final Blockin ...

  9. 【大数据】Hadoop常用启动命令

    Hadoop常用启停命令 最近在装大数据环境,不知由于年纪大的问题还是笨的缘故,老师记不住一些常用命令,在这里就单独记一下Hadoop常用的启停命令.Hadoop常用的启停命令都在hadoop/sbi ...

  10. java如何使用 tesseract 4.0.0-1.4.4

    提示: 建议直接使用tess4j,tess4j是对tesseract的封装,使用更简单 首先引入依赖 <!-- https://mvnrepository.com/artifact/org.by ...