物理查询处理
查询处理期间数据流
use Northwind
SELECT C.CustomerID,COUNT(O.OrderID) AS NumOrders
FROM dbo.Customers as c
LEFT OUTER JOIN dbo.orders as o
ON C.CustomerID = O.CustomerID
WHERE C.City = 'London'
GROUP BY C.CustomerID
HAVING COUNT(O.OrderID) > 5
ORDER BY NumOrders;
1 处理where后面的过滤条件在Customers表中来自London的消费者
2 然后根据过滤的Customers表的CustomersID查找出Orders的订单 进行ON过滤
3 对on过滤的数据进行聚合运算
4 保存聚合运算结果
5 过滤>5
6 等待sort 在没有真正输出前是不会执行SORT,所以这一步将是最后执行。此时将重新返回执行刚才的所有步骤。
编译
SQL Server把批处理中的语句编译调一个被称为执行计划的可执行单元。
编译期间,编译器会展开这些语句包含执行期间需要执行的相关约束、触发器和级联操作。
如果包含对其他存储过程的调用或者函数的调用但是在缓存中找不到他们的计划也会编译。
编译和执行是两个不同的步骤。有时候只相隔几秒。有时候相隔几天主要看缓存里面是否还存在编译好的。、
优化器并不处理每一条语句只是处理DML语言
Algebrizer
分析阶段的输出是algebrizer的输入。
algebrizer生成称为查询处理器树的输出用于查询优化。
运算符平展
我还没读懂这里讲的是什么;
名称解析
分析树中每个表名称和列名都关联到对应的表名或者列对象的引用。表示相同对象的名称具有相同的引用。
algegrizer检查查询中的每个对象名称是否真的引用了系统目录中已经存在有效或列表,以及是否在特定的查询范围内可见。
聚合绑定
分析如下sql
SELECT C1 FROM dbo.T1 GROUP BY c1
having exists
(select * from dbo.T2 WHERE T2.X > MAX(T1.C2))
MAX 属于外部查询聚合这是由algegrizer决定的