SQL Server,TOP 与 ROW_NUMBER

Eva*_*kas 9 performance sql-server execution-plan query-performance

我正在学习执行计划并尝试不同的查询并比较它们的性能并偶然发现了这一点:

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
Run Code Online (Sandbox Code Playgroud)

它们都返回相同的结果集 - 但是第一个执行速度更快并且资源消耗更少(至少 SSMS 告诉我)这是执行计划: 执行计划

与 SQL 查询计划资源管理器的比较: 在此处输入图片说明 谁能给我一些关于幕后实际发生的事情以及结果为何不同的见解?如果您还有什么需要 - 请告诉我。

谢谢,埃瓦尔达斯。

Mik*_*son 12

我猜您正在比较查询的估计成本。这些只是基于(除其他外)查询返回的估计行数的估计值。不是实际的行数。

您的第一个查询估计它将返回 30 行,而您的第二个查询估计将返回 1000 行。这就是您的查询成本差异的来源。

如果您将查询更改为仅获取 30 行,您将看到查询的估计行数相同,并且第一个查询的实际成本更高,至少在 SQL Server 2014 中对我而言是这样。

在比较查询性能时不要使用估计值。使用持续时间、读取次数和内存授权大小等内容。