作者将教大家如何优化SQL语句中的物理查询,包括分析检查语法并把SQL批处理转化成分析树、代数化(algebrization)以及查询优化三个步骤。

有几位朋友有这样的疑问:

教你怎么优化SQL语句中的物理查询  SQL 优化 物理查询 第1张

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前履行的,开篇说到的那个问题仅仅读者未了解逻辑处理和物理处理的不同罢了。

到此为止,物理处理的各个立刻也做了一个扼要的叙说,总结下,无论是存储进程仍是即席查询都是履行的一个查询方案的副本,假如这个查询方案不存在的话就有必要通过编译生成一个履行方案,在编译阶段有必要通过剖析,绑定(代数化),查询优化这些进程,终究得到咱们需求查找的成果。关于查询优化组件具体是怎样优化查询处理器树的,我会在今后的篇幅作具体介绍。

【修改引荐】

  1. 详解怎么删去SQL Server表中的重复行
  2. 用并行查询让SQL Server责怪闻风丧胆
  3. SQL Server 2005常见问题浅析
转载请说明出处
知优网 » 教你怎么优化SQL语句中的物理查询

发表评论

您需要后才能发表评论