SQL Server如何处理到达数据库引擎的查询
当一个查询到达数据库引擎时,SQL SERVER执行两个主要的步骤来产生期望的查询结果。第一步是查询编译,它生成查询计划,第二步执行这个查询计划。
SQL SERVER 2005中的查询编译由三个步骤组成:分析、代数化及查询优化。完成这些步骤后,编译器把经过优化的查询计划保存到过程缓存中。在这里,执行引擎把该计划转换为可执行的形式,然后执行其中的步骤以生成查询结果。如果今后再次执行相同的查询或存储过程时,过程缓存已经包含了该计划,则跳过编译步骤,直接重用缓存的计划来执行该查询或存储过程。
关于SQL Server的优化:
SQL SERVER并不优化批处理中的每条语句。只优化那些访问表而且可能生成多个执行计划的语句。SQL SERVER优化所有DML(数据操作语言)语句,即SELECT 、DELECT和UPDATE语句。除了DML,其他一些T-SQL语句也会被优化,CREATE INDEX便是其中之一,只有被优化过的语句才会生成查询计划。
关于SQL中的分组:
GROUP BY或HAVING之类显式子句并不是使SELECT列表被分组的唯一因素。根据SQL的规定,只要出现绑定到特定列表的聚合函数,即使没有GROUP BY或HAVING子句,也会使SELECT列表分组。下面是一个简单的示例:
SELECT c1,MAX(c2) FROM dbo.T1;
这是一个分组SELECT,因为查询中包含了一个MAX聚合。又因为它是一个分组SELECT,在其中使用非聚集的列c1是不合法的,所以该查询不正确。