对于T-SQL编程,用得最广泛的,莫过于查询(Querying)。要想写出高质量、高性能的查询语句,必须深入地了解逻辑查询处理。

一、逻辑查询处理的各个阶段

(5)SELECT DISTINCT TOP(<top_specification>) <select_list>

(1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate>

(2)WHERE <where_predicate>

(3)GROUP BY <group_by_specification>

(4)HAVING <having_predicate>

(6)ORDER BY <order_by_list>

上边语句是一个普通格式的查询语句,基本包含了所有的查询条件和关键字。你可能会发现前边的序号并不是按顺序来的,被你说对了,这是SQL与其他编程语言不同的最明显特征,就是它的执行顺序并不是按照编写顺序来的。上边的序号,就是查询语句在执行过程中的逻辑处理顺序。下面简单介绍一下各个阶段都干了啥事。

(1)FROM 阶段

FROM阶段标识出查询的来源表,并处理表运算符。在涉及到联接运算的查询中(各种join),主要有以下几个步骤:

  a.求笛卡尔积。不论是什么类型的联接运算,首先都是执行交叉连接(cross join),求笛卡儿积,生成虚拟表VT1-J1。

b.ON筛选器。这个阶段对上个步骤生成的VT1-J1进行筛选,根据ON子句中出现的谓词进行筛选,让谓词取值为true的行通过了考验,插入到VT1-J2。

c.添加外部行。如果指定了outer join,还需要将VT1-J2中没有找到匹配的行,作为外部行添加到VT1-J2中,生成VT1-J3。

经过以上步骤,FROM阶段就完成了。概括地讲,FROM阶段就是进行预处理的,根据提供的运算符对语句中提到的各个表进行处理(除了join,还有apply,pivot,unpivot)

(2)WHERE阶段

WHERE阶段是根据<where_predicate>中条件对VT1中的行进行筛选,让条件成立的行才会插入到VT2中。

(3)GROUP BY阶段

GROUP阶段按照指定的列名列表,将VT2中的行进行分组,生成VT3。最后每个分组只有一行。

(4)HAVING阶段

该阶段根据HAVING子句中出现的谓词对VT3的分组进行筛选,并将符合条件的组插入到VT4中。

(5)SELECT阶段

  这个阶段是投影的过程,处理SELECT子句提到的元素,产生VT5。这个步骤一般按下列顺序进行

a.计算SELECT列表中的表达式,生成VT5-1。

b.若有DISTINCT,则删除VT5-1中的重复行,生成VT5-2

c.若有TOP,则根据ORDER BY子句定义的逻辑顺序,从VT5-2中选择签名指定数量或者百分比的行,生成VT5-3

(6)ORDER BY阶段

根据ORDER BY子句中指定的列明列表,对VT5-3中的行,进行排序,生成游标VC6.

当然SQL SERVER在实际的查询过程中,有查询优化器来生成实际的工作计划。以何种顺序来访问表,使用什么方法和索引,应用哪种联接方法,都是由查询优化器来决定的。优化器一般会生成多个工作计划,从中选择开销最小的那个去执行。逻辑查询处理都有非常特定的顺序,但是优化器常常会走捷径。

转自:http://www.cnblogs.com/gaiyang/archive/2011/04/13/2014355.html

最新文章

  1. Clone Graph leetcode java(DFS and BFS 基础)
  2. SQL 常用的命令 (转)
  3. win7中资源管理器不能显示图片预览的解决方法
  4. Oracle数据库——体系结构
  5. 泛型类型转为DataTable类型
  6. K Smallest Sums
  7. Swift - 28 - 内部参数名和外部参数名
  8. Android初学:联系创建Activity
  9. C++求二叉树的最大高度差
  10. 在DataGrid中实现Button Command
  11. 使用hexdump工具追踪EXT4文件系统中的一个文件
  12. 605. Can Place Flowers
  13. jquery中attr()和prop()的区别
  14. JS学习笔记Day13
  15. JavaScript Date日期对象以及日期格式化方法
  16. eclipse发布web
  17. php微信公众号开发
  18. 扩大UIButton的选区
  19. C#获取当前路径的七种方法 【转载】
  20. json server的简单使用(附:使用nodejs快速搭建本地服务器)

热门文章

  1. 解决系统存在大量TIME_WAIT状态的连接
  2. Seal Report_20160923
  3. ACM学习历程—Hihocoder 1177 顺子(模拟 &amp;&amp; 排序 &amp;&amp; gcd)(hihoCoder挑战赛12)
  4. jmeter的http post请求与测试Java请求
  5. bzoj 4555 [Tjoi2016&amp;Heoi2016] 求和 —— 第二类斯特林数+NTT
  6. 湖南程序设计竞赛赛题总结 XTU 1237 Magic Triangle(计算几何)
  7. Nuget-QRCode:QRCoder
  8. css3 实现运动动画 圆与椭圆
  9. java——类的封装
  10. iOS内购流程二(添加产品、沙盒账号以及上架流程)