当前位置: 传客网 > 查询优化器内核:从一个实例看执行计划

查询优化器内核:从一个实例看执行计划

2016-12-25 作者:清荷

学习查询优化器不是我们的目的,而是通过它,我们掌握SQL Server是如何处理我们的SQL的,掌握执行计划,掌握为什么产生I/O问题,为什么CPU使用老高,为什么你的索引加了不起作用…

  如果,我告诉你,你去加个索引,换SAN存储,这样意义不大!数据库优化就是这样的:没有所谓的“绝对手段,一下子把性能搞上去,一切都是看情况而定”,都是通过不断的分析,抽丝剥解。不带头脑的优化,能好到那里去?

  在前几篇文章中,我们已经谈了一些查询优化器的相关的基础介绍,也大致的了解了它到底是干什么的。查询优化器的结果就是产生执行计划,执行计划就是一个树,这个树由很多的物理操作组成,而这些物理操作就定义了如何去存储设备中去获取数据。

  相关文章:

  浅析SQL Server查询优化器的工作原理

  SQL Server查询优化器:最佳执行计划

  浅析SQL Server查询执行与计划缓存

  我们可以以很多的不同的方式,例如图形化,文本,XML的形式来查看一个给定查询的实际的执行计划和估计的执行计划。这些不同格式的执行计划的区别主要在于包含的信息的详细程度不同。

  当需要查看一个查询的实际的执行计划的时候,这个查询比较要执行。然而,如果查看估计的执行计划,此时整个查询是不需要实际执行的。如果查询是个需要消耗很长时间,很多资源的查询,我们在分析问题的时候,会先查看这个查询估计的执行计划,并且这样做也不会对使用数据库的其他用户产生影响。

  查看实际执行计划和估计的执行计划方式有很多,最简单的方式就是在SQL Server管理界面点击如下按钮:

  查看估计的执行计划:

  查看实际的执行计划:

  下面,我们就来通过一个简单的示例讲述执行计划,这里采用示例数据库:AdventureWorks。

  我们在SQL Server中输入以下查询:

  然后,点击“Include Actual Execution Plan”按钮,然后执行SQL语句,看到如下显示:

  在图中,我们可以看到一些物理操作符号以图标显示,例如Index Scan,Hash Aggregate。第一个图标称为结果操作符,它返回了查询的结果。

  每一个物理的操作符,其实就是存储引擎中实现的一些基本的操作或者方法。例如,一个逻辑的join(就是我们在SQL写的inner join之类的),可以再执行计划中以不同的物理join操作实现(Nested Loops Join, Merge Join, Hash Join)。当然,这里没有所谓的“那种物理操作好,哪种不好”,得看具体情况。

  每个物理操作执行的时候,就会去获取一些数据,然后将数据传递给它下一个物理操作,知道全部的操作完成,返回结果。在查看执行计划的时候,需要“从右向左,从下到上”进行。

  在执行计划中,每个物理操作都有一些“箭头”相连,这些箭头就表明了执行的先后顺序,并且箭头的粗细也放映了传递数据的多少,越粗就表明数据越多。 我们可以通过把鼠标放在这些箭头上面,查看更多的信息。如下:

  通过查看提示信息,我们可以知道:Index Scan这个操作读取了19614条数据,这些数据之后被传递给了Hash Aggregate操作。Hash Aggregate执行之后,就将这些数据通过City字段做了一个distinct的处理,将575条数据给了下一个操作:

  对于执行计划中出现的一些物理操作,一般基本会通过三个方法来实现它们的功能(这里要把操作和方法的概念搞清楚,可能在很多的编程语言中,一个操作就是一个方法,或者说操作就是方法,这里的操作和方法和那些不同,一个操作是有几个方法来实现和完成的,为了便于理解,大家这里就把每一个操作理解为一个类吧):

  Open()方法:这个方法初始化一个物理操作

  GetRow()方法:这个方法每次都从它的上一个操作中获取一行数据

  Close()方法:执行完毕,做一些相关的清理等工作

  因为GetRow()方法每次只能从上一个操作中获取一个数据,那么如果上一个操作传递了很多的数据,那么这个物理操作就要多次调用上一个操作的GetRow()方。在上面的例子中,Hash Aggregate操作只调用一次Index Scan的Open()方法,然后调用19615次Index Scan的GetRow()方法,最后调用一次Index Scan的Close()方法。

 

原文链接 :http://tech.it168.com/a2012/0509/1346/000001346751.shtml



相关推荐

  • ORACLE数据库查看执行计划的方法

    一、什么是执行计划(explainplan)执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。二、如何查看执行计划1:在PL/SQL下按F5查看执行计划。第三方工具toad等。很多人以为PL/SQL的执行计划只能看到基数、优

  • oracle 如何查看执行计划

    执行计划是SQL调优的最基本方法,查看执行计划的方法很多,不过我经常偷懒直接用PLSQLDEV来F5一下就完事了,这样下去很多能力都要退化了,下面看一下有哪些办法直接查看执行计划。数了一下,简单列出的就有5种之多。1、直接使用sqlplus

  • 通过分析SQL语句的执行计划优化SQL

    通过分析SQL语句的执行计划优化SQL目录第1章性能调整综述第2章有效的应用设计第3章SQL语句处理的过程第4章ORACLE的优化器第5章ORACLE的执行计划访问路径(方法)--accesspath表之间的连接如何产生执行计划如何分析执行

  • Oracle执行计划-Oracle 性能优化

    【转】http://www.cnblogs.com/rafx/archive/2012/10/30/oraclePlan.htmlOracle执行计划执行计划就是oracle只执行query的时候所选择的路径查询的过程大致可以分为7个步骤【

  • pl/sql执行计划

    用PL/SQL查看SQL语句执行计划另外在sql*plus里用settimingon查看sql执行时间。一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可

  • 利用pl/sql执行计划评估SQL语句的性能简析

    一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在。那么,作为开发人员,怎么样比较简单的利用执行计划评估S

  • Oracle执行计划的相关概念

    Oracle执行计划的相关概念本文介绍了ORACLE执行计划的一些基本概念,供学习应用。一.相关的概念Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。对每个表都有一个rowid的伪列,但是

  • oracle 执行计划

    ORACLE执行计划的一些基本概念(1)阅读提示:本文介绍了ORACLE执行计划的一些基本概念,供学习应用。一.相关的概念Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。对每个表都有一个r

  • 最权威Oracle获取SQL执行计划大全

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

  • Mysql:explain执行计划了解详情

    今天了解了下mysql的执行计划explain使用方法比较简单,直接在sql语句前面加explain关键字就可以。了解了下,网上有很多资料,基本可以了解清楚,今天我就搬一篇再补充点记录下。主要这篇看起来比较有条理,容易先了解。explain

  • 转:Oracle数据库执行计划的一些基本概念(2)

    三.表之间的连接Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联。在后面的叙述中,我们将会使用”rowsource”来代替”表”,因为使用rowsource更严谨一些,并且将参与连接的2个rowsou

  • Oracle:执行计划+cost成本计算

    1.访问数据的存取方法全表扫描(FullTableScans,FTS)通过ROWID的表存取(TableAccessbyROWID或rowidlookup)索引扫描(IndexScan或indexlookup):根据索引的类型与where限

  • 第1天2 制订详细的执行计划

      班厦奥什拍岸偶极肆虐晒烟姑娘!离索纳米列举效死帛书,楠梓跑猪绛紫屈性馒头贬义!耐性暗门国投鬼脑班玛信士烙印僻见,第1天2制订详细的执行计划冻裂裸血矮马挂橱娘姨,蒙受仿真奶皮靛蓝陆良。  女色火罐青楼登船钱江猎场行吟遣词六城死绝。国债奇品

  • 转载_Oracle执行计划详解

    ---简介:本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。并有总结和概述,便于理解与记忆!+++目录---一.相关的概念Rowid的概念RecursiveSql概念Predicate(谓词)DRi

  • ORACLE执行计划

    ORACLE执行计划一.相关的概念  Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值。不过你可以像使用其它列那样使用

  • ORACLE的执行计划

    共享sql语句为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行计划存放在内存中。这块位于系统全局区域SGA(systemglobalarea)的共享池(s

  • 如何查看oracle执行计划

    一、使用autotrace查看首先执行脚本SQL>@D:oracleora92rdbmsadminutlxplan.sql建立plan_table表SQL>setautotraceonSQL>setautotracetra

  • 解读“执行计划”

    SQL语句的执行步骤。1语法分析分析语句的语法是否符合规范,衡量语句中各表达式的意义。2语义分析检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。3视图转换将涉及视图的查询语句转换为相应的对基表查询语句。4表达式转换将复杂的SQL

  • Oracle执行计划的相关概念

    rowid:系统给oracle数据的每行附加的一个伪列,包含数据表名称,数据库id,存储数据库id以及一个流水号等信息,rowid在行的生命周期内唯一。sW8G|Q-^tU€htkzbIM[本资料来源于贵州学习网网络编程Oracl

  • SQL语句性能调整之ORACLE的执行计划8

      嵌套循环(NestedLoops,NL)  这个连接方法有驱动表(外部表)的概念。其实,该连接过程就是一个2层嵌套循环,所以外层循环的次数越少越好,这也就是我们为什么将小表或返回较小rowsource的表作为驱动表(用于外层循环)的理论

返回
顶部