从联合中选择顶部将导致SQL Server

问题描述

我目前正在研究sql Server中的优化器,并且对从联合结果中选择数据有疑问。

如果我执行下面的查询

SELECT  TOP (100) ...
FROM (
    SELECT  ... FROM TBL1
    UNION ALL
    SELECT  ... FROM TBL2
) AS A
ORDER BY COL1,COL2

我认为(这是我学到的)内部优化程序将此查询更改为下面的查询,因此它最多可以从每个表中读取100行。

SELECT  TOP (100) ...
FROM (
    SELECT  TOP (100) ... FROM TBL1 ORDER BY COL1,COL2
    UNION ALL
    SELECT  TOP (100) ... FROM TBL2 ORDER BY COL1,COL2
) AS A
ORDER BY COL1,COL2

但是,当我签出执行计划时,优化器从两个表中读取了全部数据(使用聚集索引扫描)并对它们进行了排序。

谁能告诉我它在内部如何工作?优化器扫描整个表是否有任何特定原因?

解决方法

SQL中有一个优先顺序。据此,TOP()ORDER BY子句之后进行求值。因此,首先选择所有记录,然后对其进行排序,然后仅选择前100个记录。 您可以在此站点上参考。

SQL Select Precedence