我有2個選擇查詢。第一個執行網格分頁選擇(每頁25行)(using TOP @pagesize*@pagenum EXCEPT TOP @pagesize*(@pagenum-1) construction
)。第二個查詢總計行數。Transact SQL查詢性能建議
那麼,WITH AS
構建會提高性能與兩個分離的查詢,如果是的話,爲什麼?請注意,該查詢包含多個列,INNER JOIN和WHERE條件。
我有2個選擇查詢。第一個執行網格分頁選擇(每頁25行)(using TOP @pagesize*@pagenum EXCEPT TOP @pagesize*(@pagenum-1) construction
)。第二個查詢總計行數。Transact SQL查詢性能建議
那麼,WITH AS
構建會提高性能與兩個分離的查詢,如果是的話,爲什麼?請注意,該查詢包含多個列,INNER JOIN和WHERE條件。
使用頂部X只獲取最後一個X/Y行是個壞主意。您應該添加一個自動編號並選擇自動編號在所需範圍內的行。
SELECT ROW_NUMBER()OVER(ORDER BY [某件事] DESC)FROM ... WHERE [ROWNUMBER] 10和20之間
另外,如果使用ORDER BY ...偏移,而非TOP ... ORDER BY您可以使用COUNT(*)OVER()獲取所有行,而不管分頁。否則,您必須使用WITH(像你一樣)來隔離數據並獲得與第2臺的尋呼以及其他任何東西(行號,頁碼,總頁數等
例無偏移:
DECLARE @page INT = 1, @rows INT = 5
;WITH data AS (SELECT * FROM mytable where id = 454545) --possible filters
,rows ([page], [pages], [rows]) AS
(
SELECT @page, CEILING(CAST(COUNT(*) AS float)/@rows), COUNT(*) FROM data
)
SELECT TOP (@rows) *
FROM (SELECT row_number() OVER (ORDER BY data.id) rowNumber, * FROM rows, data) pagination
WHERE rowNumber > (@page - 1) * @rows
order by rowNumber
例與偏移:
DECLARE @page INT = 1, @rows INT = 5
SELECT
row_number() OVER (order by id) rowNumber,@page Page,(CEILING(CasT(COUNT(*) OVER() as float)/@rows)) Pages,
COUNT(*) OVER() Rows, *
from mytable where id = 454545 --possible filters
order by rowNumber
OFFset (@page-1)*@rows rows
FETCH NEXT @rows rows ONLY
在這兩種情況下,確保ORDER BY是絕對的其他分頁不能保證