优化SQL语句中的物理查询方法分享
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前执行的,开篇提到的那个问题只是读者未理解逻辑处理和物理处理的差别而已。
到此为止,物理处理的各个步骤也做了一个简要的叙述,总结下,无论是存储过程还是即席查询都是执行的一个查询计划的副本,如果这个查询计划不存在的话就必须经过编译生成一个执行计划,在编译阶段必须经过分析,绑定(代数化),查询优化这些过程,最终得到我们需要查找的结果。关于查询优化组件具体是怎么优化查询处理器树的,我会在以后的篇幅作详细介绍。(51CTO)
- 1重庆OA客户
- 2成都OA客户
- 3贵阳OA软件行业资讯
- 4北京OA行业资讯
- 5深圳OA行业资讯
- 6南京OA行业资讯
- 7南宁OA行业资讯
- 8昆明OA软件行业资讯
- 9厦门OA行业资讯
- 10合肥OA软件行业资讯
- 11郑州OA行业资讯
- 12上海OA软件行业资讯
- 1如何解决虚拟环境I/O瓶颈问题
- 2信息如何存储 云计算有国界吗?
- 3纵谈企业应用集成、业务流程集成与中间件
- 4机房管理制度如何健全完善?
- 5Cordys如何建立云中的情景应用?
- 6企业如何部署和监控虚拟环境?
- 7云计算时代的企业如何把握IT建设
- 8绿色节能为先 集群服务器功耗管理
- 9虚拟化技术解决企业现存四大技术难题
- 10沈阳腾业建设招投标有限责任公司招标OA办公软件,受沈阳市东陵区教育局的委托
- 11OA适应XX集团在未来较长时期内的发展变化
- 12固态盘技术探秘 SLC与MLC的区别
- 13云计算五大支柱 动态计算基础设施是关键
- 14数据中心冷却:绿色环保刻不容缓
- 15大规模网站系统架构技术原理解析
- 16升级到100G——高端核心交换机平台购买指南
- 17基于动态联机分析的审计信息系统
- 18OA办公软件的销售培训与项目特点
- 19SSD走进企业级应用 选购注意5要素
- 20安全仍是服务器虚拟化发展最大阻力
- 21体验全新的虚拟化数据中心价值观
- 22锁好数据防盗门 走出安全误区
- 23加密专家RSA大会对谈云计算的风险
- 243年内全球9成企业将使用开源技术
- 25网络融合要从业务和网络两个层面推进
- 26云计算终端浏览器:需要?不需要?
- 27数据集成项目成败中枢 数据模型要灵活
- 28云计算取胜的关键:标准人才运营及其他
- 29系统重装防再遭病毒侵袭 五大注意事项
- 30云计算的“智慧”:让数字开口说话