sql执行计划解析案例(二)

 
今天是2013-10-09,本来以前自己在专注oracle sga中buffer cache 以及shared pool知识点的研究。但是在研究cache buffer chain的时候发现了一个语句: select * from (select addr,ts#,file#,dbarfil,dbablk,tch from x$bh order by tch desc) where rownum<20,当时觉得很诧异,为什么要这么写呢?就是这一个语句让我开始接触了少许sql执行计划的知识,对于sql优化是一门艺术,走的路还 是很长,但是对于现在的我还是踏实一步一步走的好。现在分析如下执行计划。
SQL> select addr,ts#,file#,dbarfil,dbablk,tch from x$bh where rownum<20 order by tch desc
2 ; ADDR TS# FILE# DBARFIL DBABLK TCH
---------------- ---------- ---------- ---------- ---------- ----------
00007F64CC0825A0 0 1 1 8210 18
00007F64CC0825A0 0 1 1 233 10
00007F64CC0825A0 0 1 1 95203 4
00007F64CC0825A0 0 1 1 4571 3
00007F64CC0825A0 0 1 1 95436 2
00007F64CC0825A0 0 1 1 77851 2
00007F64CC0825A0 0 1 1 52289 1
00007F64CC0825A0 0 1 1 65536 1
00007F64CC0825A0 1 2 2 42914 1
00007F64CC0825A0 0 1 1 96368 1
00007F64CC0825A0 0 1 1 57093 1 ADDR TS# FILE# DBARFIL DBABLK TCH
---------------- ---------- ---------- ---------- ---------- ----------
00007F64CC0825A0 0 1 1 22156 1
00007F64CC0825A0 0 1 1 34704 1
00007F64CC0825A0 0 1 1 17119 1
00007F64CC0825A0 0 1 1 30133 1
00007F64CC0825A0 0 1 1 38809 1
00007F64CC0825A0 0 1 1 21224 1
00007F64CC0825A0 0 1 1 17818 1
00007F64CC0825A0 0 1 1 55928 1 19 rows selected. SQL> set autotrace trace explain
SQL> r
1 select addr,ts#,file#,dbarfil,dbablk,tch from x$bh where rownum<20 order by tch desc
2* Execution Plan
----------------------------------------------------------
Plan hash value: 2913638504 ---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19 | 1349 | 1 (100)| 00:00:01 |
| 1 | SORT ORDER BY | | 19 | 1349 | 1 (100)| 00:00:01 |
|* 2 | COUNT STOPKEY | | | | | |
| 3 | FIXED TABLE FULL| X$BH | 19 | 1349 | 0 (0)| 00:00:01 |
--------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - filter(ROWNUM<20) SQL>
该sql的执行顺序为id3-》id2—》id1-》id0,首先对固定表x$bh进行全表扫描,完了之后进行统计所有数据(没有拍过续的),这时候的过滤条件为:filter(ROWNUM<20),然后执行到id1的时候在对这20条数据进行排序,但是这个时候安装tch排序的是在一个大的表中抽取的20条然后再进行排序,并不能找到对数据块操作最频繁的块。
eg:

SQL> select * from (select addr,ts#,file#,dbarfil,dbablk,tch from x$bh order by tch desc) where rownum<20
  2  ;

Execution Plan
----------------------------------------------------------
Plan hash value: 2453498899

--------------------------------------------------------------------------------
| Id  | Operation               | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |      |    19 |  1349 |     1 (100)| 00:00:01 |
|*  1 |  COUNT STOPKEY          |      |       |       |            |          |
|   2 |   VIEW                  |      |   100 |  7100 |     1 (100)| 00:00:01 |
|*  3 |    SORT ORDER BY STOPKEY|      |   100 |  7100 |     1 (100)| 00:00:01 |
|   4 |     FIXED TABLE FULL    | X$BH |   100 |  7100 |     0   (0)| 00:00:01 |
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<20)
   3 - filter(ROWNUM<20)

SQL> set autotrace off
SQL> r
  1  select * from (select addr,ts#,file#,dbarfil,dbablk,tch from x$bh order by tch desc) where rownum<20
  2*

ADDR                    TS#      FILE#    DBARFIL     DBABLK        TCH
---------------- ---------- ---------- ---------- ---------- ----------
00007F64CBFCD840          0          1          1       2017        162
00007F64CBFCD840          0          1          1       2016        161
00007F64CBFCD840          0          1          1       3025         54
00007F64CBFCD840          0          1          1       3073         50
00007F64CBFCD840          0          1          1        385         50
00007F64CBFCD840          0          1          1        169         50
00007F64CBFCD840          0          1          1        345         49
00007F64CBFCD840          0          1          1       3057         49
00007F64CBFCD840          0          1          1        337         49
00007F64CBFCD840          0          1          1        481         49
00007F64CBFCD840          0          1          1      46461         48

ADDR                    TS#      FILE#    DBARFIL     DBABLK        TCH
---------------- ---------- ---------- ---------- ---------- ----------
00007F64CBFCD840          0          1          1       2945         46
00007F64CBFCD840          0          1          1        489         43
00007F64CBFCD840          0          1          1        170         42
00007F64CBFCD840          0          1          1        577         42
00007F64CBFCD840          0          1          1       1625         41
00007F64CBFCD840          0          1          1        490         41
00007F64CBFCD840          0          1          1       2946         41
00007F64CBFCD840          0          1          1        386         41

19 rows selected.

SQL>

对于该sql的执行计划就有意思了。执行顺序为:id4-》id3-》id2-》id1-》id0,首先也是对固定表x$bh进行全表扫描,然后通过对停止键进行排序过滤出排序过后的20条数据; 3 - filter(ROWNUM<20),完了之后把结果集作为一个view,然后再去统计所有的数据过滤条件为:1 - filter(ROWNUM<20)。其实对于order by在此是做了一个排序,看下面这句话:搜索引擎会简单的搜索这个表,然后缓存一部分数据到cache这个就是20,然后再去做比较,并取代较小的值,取出20条。
"the run-time engine simply scanned the table, keeping a cache of the top
10 values. It didn’t really sort 1,000,000 rows, it merely checked each row to see if it was larger
than the smallest item in the current cache and should replace it. At the end of the scan, it only
had 10 rows to sort."
这就是这两个sql语句执行计划的区别。

sql执行计划解析案例(二)的更多相关文章

  1. Oracle sql执行计划解析

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

  2. 两个左连接SQL执行计划解析(Oracle和PGSQL对比):

    上一篇解析链接如下: https://www.cnblogs.com/wcwen1990/p/9325968.html 1.SQL示例1: SQL> select * from ( select ...

  3. 一个RDBMS左连接SQL执行计划解析

    1.测试数据如下: SQL> select * from t1;  a | b  | c ---+----+---  1 | 10 | 1  2 | 20 | 2  3 | 30 | 3  4 ...

  4. spark sql 执行计划生成案例

    前言 一个SQL从词法解析.语法解析.逻辑执行计划.物理执行计划最终转换为可以执行的RDD,中间经历了很多的步骤和流程.其中词法分析和语法分析均有ANTLR4完成,可以进一步学习ANTLR4的相关知识 ...

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

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

  6. DB查询分析器7.01新增的周、月SQL执行计划功能

                DB查询分析器7.01新增的周.月SQL执行计划功能 马根峰              (广东联合电子服务股份有限公司, 广州 510300) 1      引言   中国本土 ...

  7. SQL执行计划解读

    声明 5.6中desc看不到show warnings,也看不到filtered列 5.7的desc等于5.6的desc extended,这样可以看show warnings,5.6中filtere ...

  8. sql执行计划(书中个人总结)

    一.什么是sql执行计划 执行一条sql,以最快最低消耗获取出所需数据的一个执行过程. 二.如何获取执行计划 执行计划获取的六种方式: 1.explain plan for 优点和缺点: 2.set ...

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

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

随机推荐

  1. uboot 顶层makefile细节分析

    uboot的源文件众多,学习庞然大物首先找到脊椎--顶层的makfile,逐一破解.但是,uboot的makefile同样是一个庞然大物,所以也要找到它的主线.倘若过分专注部分细节,很难做到把握全局, ...

  2. VMware网络选项分析

    摘自资料:VMware网卡选项分析.zip 很多朋友都曾问到关于Guest和Host互联,其实这并不是一件困难的事情,只要能够理解VMware的网络模型即可,今天结合着我的虚拟机,来详细介绍一下VMw ...

  3. C++ 11 笔记 (一) : lambda

    时至今日都是我咎由自取,错就是错,与任何人无关.掉进C++98的各种坑里无法自拔的抖M感,让我选择了华丽丽的无视C++11,导致今日面对开源的代码到各种看不懂的地步,一入C++深似海,我今天愿意承担一 ...

  4. SQL效率低下原因主要有

    类别 子类 表达式或描述 原因 索引 未建索引   产生全表扫描   未利用索引 substring(card_no,1,4)=′5378′ 产生全表扫描     amount/30< 1000 ...

  5. 文件操作 - NSFileManager

    iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认 ...

  6. Metasploit渗透测试魔鬼训练营

    首本中文原创Metasploit渗透测试著作,国内信息安全领域布道者和资深Metasploit渗透测试专家领衔撰写,极具权威性.以实践为导向,既详细讲解了Metasploit渗透测试的技术.流程.方法 ...

  7. CENTOS6上禁用IPV6和DHCP

    centos 6禁用ipv6方法   首先,在终端输入 ip -6 addr show 和 lsmod | grep ipv6查询一下有无安装IPV6模块,或用netstat -nuptl查看是否有i ...

  8. [转贴]Linq之动态查询

    最近写Linq碰到一个问题, 就是如果要写一个查询系统,这个系统里面有很多TextBox可以填, 然后捞出符合各个字段的数据. 在SQL查询的时候还满方便的,用字符串连连连就可以了, ( 也就是sql ...

  9. No modifications are allowed to a locked ParameterMap

    错误:java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap at org.apa ...

  10. 【HDOJ】1160 FatMouse's Speed

    DP. #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXNUM 1005 ...