如何在SQL Server 2008中完成查询执行

时间:2011-10-20 12:36:23

标签: sql sql-server-2005 sql-server-2008

我正在使用SQL Server 2008,并且非常想知道引擎如何执行查询。

我们假设我运行此查询:

select * from <table1> with(nolock)

或与加入相同:

select * from <table1> a with(nolock) 
join <table2> b with(nolock) on a.<column1> = b.<column1> 
where <some condition>

查询如何在幕后工作?
有没有办法看到执行和显示结果的实际步骤?

2 个答案:

答案 0 :(得分:4)

数据库引擎分析查询并选择在当前条件下检索所请求数据的最佳方法。

请参阅Displaying Graphical Execution Plans (SQL Server Management Studio)

答案 1 :(得分:-1)

列表1-1逻辑查询处理步骤编号

(5) SELECT (5-2) DISTINCT (5-3) TOP(<top_specification>) (5-1) <select_list> (1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate> | (1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias> | (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias>| (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias> (2) WHERE <where_predicate> (3) GROUP BY <group_by_specification> (4) HAVING <having_predicate> (6) ORDER BY <order_by_list>;

逻辑查询处理阶段简要

■(1)FROM FROM阶段标识查询的源表和进程表 运营商。每个表运算符都应用一系列子阶段。例如,阶段 参与连接的是(1-J1)笛卡尔积,(1-J2)ON滤波器,(1-J3)添加外行。 FROM阶段生成虚拟表VT1。

■(1-J1)笛卡尔积此阶段执行笛卡尔乘积(交叉连接) 表运算符中涉及的两个表,生成VT1-J1。

■(1-J2)ON过滤器此阶段根据谓词对VT1-J1中的行进行过滤 出现在ON子句()中。只有谓词计算的行 将TRUE插入VT1-J2。 (1-J3)添加外行如果指定了OUTER JOIN(与CROSS JOIN相反或 INNER JOIN),保留的表中没有找到匹配项的行 从VT1-J2作为外行添加到行中,生成VT1-J3。

■(2)WHERE此阶段根据出现的谓词对VT1中的行进行过滤 WHERE子句()。只有谓词计算结果的行 TRUE被插入VT2。

■(3)GROUP BY此阶段根据列排列VT2中的行 GROUP BY子句中指定的列表,生成VT3。最终,会有一个 每组结果行。

■(4)HAVING此阶段根据谓词对VT3中的组进行过滤 出现在HAVING子句()中。只有哪些组 将谓词评估为TRUE插入VT4。

■(5)SELECT此阶段处理SELECT子句中的元素,生成VT5。

■(5-1)评估表达式此阶段评估SELECT列表中的表达式, 生成VT5-1。

■(5-2)DISTINCT此阶段从VT5-1中删除重复行,生成VT5-2。

■(5-3)TOP此阶段过滤指定的最高行数或行数百分比 VT5-2基于ORDER BY子句定义的逻辑排序,生成 表VT5-3。

■(6)ORDER BY此阶段根据列列表对VT5-3中的行进行排序 在ORDER BY子句中指定,生成游标VC6。