理论上,SQL Server 中的每条语句都会创建传递给下一条语句的虚拟表。换句话说,当 FROM 和 Where 子句完成后,下一步是从之前创建的虚拟组中选择列。
但是,可以按选择列表中未列出的列对结果集进行排序。
当 SELECT 子句在 ORDER BY 之前执行并且哪个主要任务是选择列进行渲染时,这怎么可能?
这有点令人困惑,或者我没有得到任何东西。
理论上,SQL Server 中的每条语句都会创建传递给下一条语句的虚拟表。换句话说,当 FROM 和 Where 子句完成后,下一步是从之前创建的虚拟组中选择列。
但是,可以按选择列表中未列出的列对结果集进行排序。
当 SELECT 子句在 ORDER BY 之前执行并且哪个主要任务是选择列进行渲染时,这怎么可能?
这有点令人困惑,或者我没有得到任何东西。
这并不总是可能的:
(VT5 是由 生成的虚拟表返回
SELECT
)解释摘自“Inside SQLServer 2008 T-SQL Querying” ——我不确定这个特定的章节是否可以在线获得(第 6 步:演示
ORDER BY
阶段,第 16 页。)因此,
给出一个错误:
在这种情况下发生的情况是排序的列现在将成为
Output
扫描/查找操作的一部分。例如,举这个例子:现在进行这个查询(不排序,只检索两列的数据):
我们将有一个执行计划,对于聚集索引扫描,输出列表为
some_int
和some_bigint
。正如你所期望的那样。现在让我们更改此查询并对列进行排序,但不要将其包含在选定的列数据中:现在我们有一个关于聚集索引扫描的输出列表,其中包括
id
、some_int
和some_bigint
。