当一个查询到达数据库引擎时,SQL Server执行两个主要的步骤来产生期望的查询结果:

  第一步:查询编译,生成查询计划。

  第二步:执行这个查询计划。

1. 用于演示分析执行计划的查询语句

/*
查询返回所有来自London且发生过5个以上订单的所有消费者的ID和订单数
*/
USE Northwind
GO SELECT
C.CustomerID
,COUNT(O.OrderID) AS NumOrders
FROM Customers C
LEFT OUTER JOIN dbo.Orders O ON C.CustomerID = O.CustomerID
WHERE C.City = 'London'
GROUP BY C.CustomerID
HAVING COUNT(O.OrderID) > 5
ORDER BY NumOrders

2. 图形化的查询计划,如下图:

3. 上图中的箭头,表示数据流。箭头的粗细,表示传递数据行数的多少。鼠标放到1所在位置的线上时,可以看到对应的详细信息。

4. 查询引擎先对Customers表执行Index Seek(把鼠标放到Index Seek图表上,可以看到如下提示窗口),找到第一个来自London的Customer,并且把该行数据传递到Nested Loops运算符。

5.数据传递到Nested Loops运算符以后,激活运算符的内侧运算(Compute Scalar,Stream Aggregate,Index Seek).首先执行Index Seek。根据Nested Loops的外部输入对应的CustomerID,查询到对应的Order.

6.上一步Index Seek查询的结果,传递给Stream Aggregate运算符。在执行Stream Aggregate运算中定义了表达式[Expr1009]=Count(*),进行数据统计。

【Stream Aggregate 运算符按一列或多列对行分组,然后计算查询返回的一个或多个聚合表达式。此运算符的输出可供查询中的后续运算符引用和/或返回到客户端。Stream Aggregate 运算符要求输入在组中按列进行排序。如果由于前面的 Sort 运算符或已排序的索引查找或扫描导致数据尚未排序,优化器将在此运算符前面使用一个 Sort 运算符。在 SHOWPLAN_ALL 语句或 SQL Server Management Studio 的图形执行计划中,GROUP BY 谓词中的列会列在 Argument 列中,而聚合表达式列在 Defined Values 列中。】【摘自:technet】

7.Stream Aggregate 运算符的统计结果,传递给Cumpute Scalar运算符,在执行Cumpute Scalar中定义了表达式[Expr1004]=CONVERT_IMPLICIT(int,[Expr1009],0);

Cumpute Scalar运算符把统计结果[Expr1004]保存到从Nested Loops外部输入的那行数据中。

8.新组成的这行数据,被传送到Cumpute Scalar运算符(Nested Loops左侧的),在这一步的过程中Expr1004表达式被重新赋值[Expr1004]=CASE WHEN [Expr1004] IS NULL THEN (0) ELSE [Expr1004] END;重新被赋值的表达式[Expr1004]被传递给Filter运算符。

9.Filter运算符接收到数据以后,执行了WHERE:([Expr1004]>(5))的条件判断;如果条件判断为真,则把结果传递给Sort运算符。

10.Sort运算符接收到数据以后,并不会马上把数据传递到下一步。而是重复4-10的步骤;当所有的行到达Sort运算符后,执行Sort运算符操作,向下一步传递按正确顺序的行数据。

【示例数据库脚本】http://files.cnblogs.com/ucos/Northwind.zip

最新文章

  1. VS2013不显示最近打开文件
  2. 18、(番外)匿名方法+lambda表达式
  3. Node.js 究竟是什么
  4. BZOJ2584 : [Wc2012]memory
  5. 把Nodepad++添加进右键菜单
  6. 欧拉工程第56题:Powerful digit sum
  7. cocos2d-x 网格动画深入分析
  8. 浅谈Perl的类、包、模块与面对对象编程
  9. poj 1068 Parencodings 模拟
  10. 基于Ajax的长轮询(long-polling)方式
  11. Microsoft Excel 自动取数据库数据
  12. HBuilderX——编译失败:HBuilderX 安装目录不能包括 ( 等特殊字符
  13. python 判断连个 Path 是否是相同的文件夹
  14. 关于window.localtion的用法几点总结
  15. 泊爷带你学go -- 反射的经典玩法
  16. 连接HTTP服务器
  17. mac终端不好用?用brew神器代替
  18. office2016如何激活
  19. Java设计模式六大原则之场景应用分析
  20. 【DVWA】Web漏洞实战之File Upload

热门文章

  1. SQL Server 2008自动备份数据库
  2. C++ string的那些坑
  3. libuv移植到android
  4. centos6.5 mqtt安装
  5. (四)伪分布式下jdk1.6+Hadoop1.2.1+HBase0.94+Eclipse下运行wordCount例子
  6. Isomorphic JavaScript: The Future of Web Apps(译)
  7. NYOJ 133 子序列 (离散化)
  8. 在mac上安装ruby
  9. Git HTTPS 方式自动保存用户名密码
  10. 学习Python函数笔记之二(内置函数)