问题描述
我目前正在研究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个记录。
您可以在此站点上参考。