首页 | 软件中心 | Designand Inspiration
读库教程网 > 网络教程 > 网页编程 > SQL学院 > MSSQL > SQL语句物理查问优化讨论

SQL语句物理查问优化讨论

添加:2010年5月11日

  有几位同伴有这样的疑问:

  select *

  from tab1, tab2

  where tab1.id = tab2.id and tab1.col1 = 123 and tab2.col1 = 'abc'

  照你所述的执行顺序,先要tab1和tab2执行笛卡尔乘积,再依照tab1.col1 = 123 and tab2.col1 = 'abc'执行挑选。这样的话,效率岂不是很低,数据库有这么愚笨吗?

  我想许多人都会有这个疑问,包括我在开始学习的时辰也提出过这样的疑问。那么,我的这篇文章就结合这个疑问来讨论一下SQL Server的物理查询处理。最先咱们必需明白逻辑处理和物理处理和区别,逻辑处理是指执行一个查询应该发生什么样的后果,那么逻辑查询的各个阶段就是这个查询从逻辑上执行的先后顺序,依照这个先后顺序就能得到正确的后果,正如咱们做四则混合运算一样,先乘除后加减才干得到正确后果。

  所以说逻辑查询只关怀发生一个咱们希冀的、正确的后果,它并不关怀发生这个后果须要多少的资源消耗。而物理处理就是如何得到这个后果,这个时辰才会思索功用疑问。下面咱们就讨论下如何执行这个物理处理的。

  当一个查询抵达数据库引擎的时辰,数据库引擎须要做的是执行这个查询的查询方案,那么这个时辰就存在两种情况,一种能够是这个查询的查询方案以前在缓存中,这种情况就直接执行这个查询方案。另外一种情况就是在缓存中找不到该查询的查询方案。没有如何办?生成一个!如何生成?

  执行方案是在编译阶段生成的,编译须要阅历三个步骤:剖析、代数化(algebrization)、查询优化,看见没有这里的查询优化流程就能处理上面的同伴提出的先笛卡尔集在挑选形成功用低的疑问。下面我就对这三个步骤作一个简介。

  第一步:剖析是检验语法并把SQL批处理转化成剖析树的流程,如select * t1 where id in(1,2,3,4,5,6,7)在被剖析树剖析后就展开成了select * t1 where id=1 or id=2 or id=3 or id=4 or id=5 or id=6 or id=7 ,除此之外尚有检验语法能无法正确的功用。

  第二步:接下的流程是代数化(algebrization),这个阶段运用SQL Server 2005的新组件algebrizer,algebrizer组件的首要功用是绑定,因而代数化流程通常称为绑定。这个阶段是将第一步的剖析树作为输入,生成被称为查询处理器树的输出,用于查询优化。原本这个阶段首要做多个事情,

  一:运算符平展,容易的讲就是把二元运算符组合成N元运算符,这里必需给出一个示例才干很好的解释这个二元转换成N元如第一步所示in操作展开成了一连串的or运算符,而剖析器以为这些or都是二元的,也就是说它以为第一个or 的左孩子是id=1,右孩子是 (id=2 or id=3 or id=4 or id=5 or id=6 or id=7 )这个表达式,而右孩子又被以为是二元的,如此一来就必需执行一个递归流程。而运算符平展流程则将这种二元运算组合成n元运算符,就防止了递归的流程。

  二:称号剖析,这个流程原本就是检验这个查询中出现的表或许是表的列是不是在数据库中真实存在。以及在该查询流程中是不是可见的。三:类型派生,有点笼统,举个例子就能了解了,比如union查询吧,union左右两边查询后果对应位置的数据类型应该是一致的。四:聚合绑定和组分绑定,执行完这个步骤后查询处理器树便生成了。

  第三步:查询优化,这个流程由查询优化器组件来完成的。查询中应该以何种顺序访问表,运用哪种方法和运用哪个索引,应该由哪个联接算法等都是由查询优化器组件来决议的,但是这个决议也不是随意的,它必需满足的前提条件是保证开头得到的后果集必需是正确的,也就是说该后果集必需遵照逻辑处理的各个阶段所得到的后果集类似。优化器会尝试该查询的许多变体,一查找本钱最低的方案。

  假设优化器剖析该查询的元数据得知只需一个可执行的方案,那么它就不会再尝试寻求更好的方案,这个步骤叫做纤细方案优化。假设没有找到纤细方案优化,SQL Server将执行一些简化,简化就是对自身语法作一些转换,比如在联接前计算表的where挑选器,如前一篇描画的,逻辑查询中where挑选总是在联接之后计算,但是先计算where挑选器在联接一样能得到的正确的后果,而这样的效率往往是更高的,所以在物理处理中where往往在join前执行的,开篇提到的那个疑问只是读者未了解逻辑处理和物理处理的差异而已。

  到此为止,物理处理的各个步骤也做了一个简明的叙说,总结下,无论是存储流程照旧即席查询都是执行的一个查询方案的副本,假设这个查询方案不存在的话就必需阅历编译生成一个执行方案,在编译阶段必需阅历剖析,绑定(代数化),查询优化这些流程,开头得到咱们须要查找的后果。关于查询优化组件详细是如何优化查询处理器树的,我会在现在的篇幅作细致简介。



读库教程网文章由网络收集后整理发布,文章发布人拥有该内容的所有权力及责任!

如果你喜欢这页,可以按Ctrl+D收藏起来。

相关内容
上一个内容:SQLServer2008R2数据爱护两特点新亮相
下一个内容:没有了
相关评论
公益广告
精彩推荐
友情链接: 百分百青年 | 烛光信息网 | 夏布新网 | 新育互联网
管理员:QQ:27038219, E-mail:27038219@qq.com今日更新
读库教程网所有文章从网络收集所发布,文章发布人拥有该内容的所有权力及责任,转载时请注明出处!
Template designed by www.dkuu.com. Optimized for 1024x768 to Firefox,Opera and MS-IE6/IE7.