因为生成查询计划的代价比较大,所以查询计划将会被缓存。
树形结构
SQL 查询首先被转化为树形结构,每个节点都是一个查询操作。例如:
SELECT * FROM Customers C INNER JOIN Orders O ON C.cid = O.cid WHERE O.date = '2008-11-06'
可能转化成如下的树形结构
什么是优化
首先,查询优化器没有办法找到最佳的执行计划。很多复杂的情况下这个目标都是无法实现的。
所以查询优化器只会尽快的找到比较好的查询计划。
优化如何工作?
规则
查询优化器有各种各样的规则。根据这些规则产生不同的树形结构。这些结构中最好的输出将会成为查询优化器最终的执行计划。
特性
特性能够从更高的层面上优化查询树
SELECT col1 , col2 , MAX(col3) FROM Table1 GROUP BY col1 , col2 ;
如果col1和col2上有惟一约束的话,就完全没有必要做MAX和GROUP BY的操作。
SELECT * FROM DomainTable D1 INNER JOIN DomainTable D2 ON D1.col1 = D2.col1 WHERE D1.col1 > 5 AND D2.col1 < 0 ;
这里显然查询条件有矛盾,查询优化器直接就不需要查询了。
操作
SQL Server 2008有大概40多个逻辑操作和更多的物理操作。
Semi-Join
半连接用来搞起例如两个表join但是只返回其中一个表结果的情况。多数子查询都是通过半连接的方式来处理的。
Spools
SQL Server 有很多功能不同的池。它们都做同样的功能,从input里面读取所有的行,然后将这些记录存在内存或者磁盘上,然后允许查询直接读取这些缓存。
限制
尽管大多数时候,查询优化器干的不错,但是以下几种情况总是工作的不好。
多个判断条件在同一个操作中
很深的查询树
一些不常用的操作
索引选择
索引有两种操作,Seek 和 Scan
判断能够转换成索引操作的通常称为sargable.