select * from A
inner join B on (A.a=B.b)
inner join C on (A.a=C.c)
inner join D on (A.a=D.d)
inner join E on (A.a=E.e)
inner join F on (A.a=F.f)
inner join G on (A.a=G.g)
inner join H on (A.a=H.h) 这 个查询有多个可能的实现计划,因为inner join可能被以不同的顺序计算。事实上,查询计划的可能数量实际上比N!=N*(N-1)*……& amp;#8230;…要大得多。随着查询中表数量的增加,可供考虑的替代方案集迅速增加,变得计算机也无法计算。各种可能查询计划的存储也成了一个问题。在一个32-bit的Intel x86机器中,SQL server实际上只能使用1.6G内存来编译一个查询,存储每一种可能方案在内存是是不可能的。即便计算机能存储各种替代计划,用户绝不会等待N久来等待系统枚举各种可能的选择。查询优化器使用启发式解决这个问题,并用统计来引导这些启发,这正是本章要阐述的内容。
很多人会认为查询优化器会对每一个给定的查询而选择一个“最佳”的查询计划。可实际上不可能所有的可能计划都被筛选一遍,因此,快速选择一个“足够好的”计划,更贴近于“查询优化”的定义,这才是我们致力追求的目标。
■查询优化器如何浏览查询计划?
查询优化器使用框架(Framework)搜索和有效地比较各种可能的替代计划, 这个框架允许SQL Server考虑复杂的,并不容易判断的方式实现给定的查询。持续地跟踪所有可替代计划并有效地找出一个计划并非一件易事,SQL Server的搜索框架包括几个组件,有助于它在有效而可靠地执行任务。
■ 规则(Rules)
查询优化器是一个搜索框架,从一个给定的查询树,查询优化器考虑将树 从当前状态转化为一个不同的的等效状态,而这个状态将被存储在内存中。在SQL Server使用的框架中,这个转化是通过“规则(rule)",这些规则和你在学校里喜欢学习的工科数学定理非常类似。例如"A inner join B"和"B inner join A"结果肯定是一样的,就像数学中的(2+1)和(1+2)的结果相等一样。这些规则被匹配到树模式,如果适于生成新的替代计划,则规则被应用。这些规则 组成了查询优化器工作的基础,它们也有助于编码某些必须的启发式(以使其在合理的时间范围内执行搜索)。
查询优化器有各种不同的规则。规则启发性地重写一个查询树为一个新的形态(shape),被称为“替代规则”, 考虑工科数学等式的规则被称为“勘探规则(exploration rules)”。这些规则生成一些新的树形态,但并不直接执行。转换逻辑树为将要被执行的物理树的规则被称为“ 实现规则(implementation rule)”,这些生成的物理替代计划中的最佳者最终被查询优化器输出作为最终的查询执行计划。
查询优化的更多原文,请查看:http://www.SQLserverInternal.com/companion/
■属性(Properties)
查询框架用一种(针对规则而言)对它更易于工作的格式采集关于查询树的信息,这些信息称为属性(Properties)。它们从子树(sub-tree) 中收集信息,这些信息有助于做决定什么样的规则能被在一个更高的点上被处理,例如,一个在SQL Server中使用的属性是一个在数据中(组成惟一键的)列的集合。看下面的一个例子:
IF EXISTS (SELECT * FROM sys.tables
WHERE name = 'Groupby')
DROP TABLE Groupby;
GO
CREATE TABLE [dbo].[Groupby](
[Col1] [int] NOT NULL,
[Col2] [int] NULL,
[Col3] [int] NULL
)
go
alter table groupby add constraint uniquel unique(col1,col2)
GO
insert into Groupby
select 1,3,4
union all select 2, 4,3
union all select 3,6,5
union all select 4,8,8
go
select Col1,Col2,max(Col3) from Groupby group by Col1,Col2http://k9pulq.blu.livefilestore.com/y1p3a6Ecf-P294nt0VTHhGbmKqAiq9VCN8d4jsv9oX-I5fyyGLdaP7_WGaEI4KyG0jzZx4fovYFgE5wG40Ck3ycetpfCVzmY_bP/2010-05-12%2000-12-05.png
SQL Server在优化期间采集N多属性。正如其他编译器所做的那样,SQL Server查询优化器采集有关每个查询中引用的列的域限制信息。从预测、连接条件、分区信息中采集信息,检查限制以知道这些预测如何被用于优化查询。关 于纯量属性的一个有用的场景是矛盾探测(in contradiction detection)。查询优化器能判定查询是否不会返回任何行。
看下 面的例子 ,
create table domaintable(col int)
go
select * from domaintable d1
inner join domaintable d2 on d1.col=d2.col
where d1.col>5 and d2.col