我正在学习执行计划并尝试不同的查询并比较它们的性能并偶然发现:
SELECT StatisticID
FROM (
SELECT StatisticID, ROW_NUMBER() OVER (ORDER BY StatisticID) AS rn
FROM FTCatalog.Statistic
) AS T
WHERE T.rn <= 1000
ORDER BY rn
SELECT TOP 1000 StatisticID
FROM FTCatalog.Statistic
ORDER BY StatisticID
它们都返回相同的结果集 - 但是第一个执行得更快并且资源消耗更少(至少 SSMS 告诉我)以下是执行计划:
SQL Query Plan Explorer 的比较: 谁能给我一些关于幕后实际发生的事情以及为什么结果不同的见解?如果您还有其他需要 - 请告诉我。
谢谢,埃瓦尔达斯。
我猜您正在比较查询的估计成本。这些只是基于(除其他外)查询返回的估计行数的估计。不是实际的行数。
您的第一个查询估计它将返回 30 行,而您的第二个查询估计将返回 1000 行。这就是您的查询成本差异的来源。
如果您将查询更改为仅获取 30 行,您将看到查询的估计行是相同的,并且第一个查询的成本实际上要高一些,至少在 SQL Server 2014 中对我来说是这样。
在比较查询性能时不要使用估计值。改用持续时间、读取次数和内存授权大小等内容。