我試圖用谷歌搜索在查詢中使用 Top 與使用 Ranking 或 Row_Number 型別函式的成本。
每個功能的成本是否取決于情況,或者這兩個功能的成本是否可以針對所有情況全面確定?
下面是一些模擬 SQL,使用簡單的 CTE 來演示我的問題,如下所示:
WITH fData AS
(
SELECT 1 AS ID, 'John' AS fName, 'Black' AS lName, CAST('05/19/1975' AS DATE) AS birthDate UNION ALL
SELECT 2 AS ID, 'John' AS fName, 'Black' AS lName, CAST('04/1/1989' AS DATE) AS birthDate UNION ALL
SELECT 3 AS ID, 'John' AS fName, 'Black' AS lName, CAST('11/16/1995' AS DATE) AS birthDate UNION ALL
SELECT 4 AS ID, 'John' AS fName, 'Black' AS lName, CAST('01/16/1968' AS DATE) AS birthDate UNION ALL
SELECT 5 AS ID, 'John' AS fName, 'Black' AS lName, CAST('01/16/1968' AS DATE) AS birthDate
)
/* Using TOP 1 vs Row_Number() - Uncomment this and comment the below to VIEW TOP version */
--SELECT TOP 1 d.ID, d.fName, d.lName, d.birthDate
--FROM fData d
--ORDER BY d.birthDate
/* Using the below vs TOP 1 */
SELECT * FROM
( SELECT d.ID, d.fName, d.lName, d.birthDate, Row_Number() OVER (ORDER BY d.birthDate) AS ranker
FROM fData d
) r
WHERE r.ranker = 1
使用 TOP 時,不需要在其周圍應用輔助 Wrapping 查詢,它看起來更干凈。應用 Row_Number 或 Ranking 函式后,您必須將其包裝以告訴查詢您現在想要哪一行...通過應用 WHERE ranker = 1 或 ranker >= 5 來達到與 TOP 1 或 TOP 5 相同的效果。
如果這是可以確定的,哪個更好更快?
uj5u.com熱心網友回復:
在您的示例中,TOP效率更高。
執行計劃TOP如下

TOP N排序N=1只需要跟蹤birthDate它看到的最低行。
對于 row_number 查詢,它識別出行號始終是升序的,并且它本身會將 a 添加TOP 1到計劃中,但它不會將分隔的TOP和組合SORT成 a TOP N Sort- 所以它對所有 5 行進行完整排序。

在索引以所需順序提供行而不需要排序的情況下,它不會有太多內容。row_number 查詢將有兩個額外的運算子,無論如何這些運算子都相當便宜。
為什么在 SQL Server 中有 TOP 時使用排名函式
排名功能一般比TOP.
對于兩者都可以作業的情況,請考慮這TOP是一種相當古老的專有語法,而不是標準 SQL。在添加視窗功能之前,產品中已經存在很長時間了。如果可移植 SQL 是一個問題,則不應使用TOP.
盡管您也可能不使用排名功能。作為另一個(標準 SQL)替代方案是
SELECT d.ID, d.fName, d.lName, d.birthDate
FROM fData d
ORDER BY d.birthDate
OFFSET 0 ROWS
FETCH NEXT 1 ROW ONLY
這給出了相同的計劃 TOP 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/414983.html
標籤:
上一篇:有沒有辦法優化這個SQL查詢?
