[译]SQL Server 之 查询优化器

时间:2023-03-09 05:55:25
[译]SQL Server 之 查询优化器

因为生成查询计划的代价比较大,所以查询计划将会被缓存。

树形结构

SQL 查询首先被转化为树形结构,每个节点都是一个查询操作。例如:

SELECT  *
FROM    Customers C
        INNER JOIN Orders O ON C.cid = O.cid
WHERE   O.date = '2008-11-06'

可能转化成如下的树形结构

[译]SQL Server 之 查询优化器

什么是优化

首先,查询优化器没有办法找到最佳的执行计划。很多复杂的情况下这个目标都是无法实现的。

所以查询优化器只会尽快的找到比较好的查询计划。

优化如何工作?

规则

查询优化器有各种各样的规则。根据这些规则产生不同的树形结构。这些结构中最好的输出将会成为查询优化器最终的执行计划。

特性

特性能够从更高的层面上优化查询树

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.