我有 2 个选择查询。第一个执行网格分页的选择(每页 25 行)(using TOP @pagesize*@pagenum EXCEPT TOP @pagesize*(@pagenum-1) construction
)。第二个查询总行数。
那么,WITH AS
与两个分离的查询相比,构造会提高性能,如果是,为什么?请注意,该查询包含多个列、INNER JOIN 和 WHERE 条件。
我有 2 个选择查询。第一个执行网格分页的选择(每页 25 行)(using TOP @pagesize*@pagenum EXCEPT TOP @pagesize*(@pagenum-1) construction
)。第二个查询总行数。
那么,WITH AS
与两个分离的查询相比,构造会提高性能,如果是,为什么?请注意,该查询包含多个列、INNER JOIN 和 WHERE 条件。
使用 top X 只获取最后的 X/Y 行是一个坏主意。您应该添加一个自动编号并选择自动编号在所需范围内的行。
SELECT ROW_NUMBER() OVER (ORDER BY [Something] DESC) FROM ... WHERE [RowNumber] BETWEEN 10 AND 20
或者,如果您使用 ORDER BY ... OFFSET 而不是 TOP ... ORDER BY 您可以使用 COUNT(*) OVER () 来获取所有行,而不管分页。否则,您必须使用 WITH(就像您所做的那样)隔离数据并使用第二个表以及其他任何内容(行号、页面、总页数等)进行分页。
没有偏移的例子:
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 是绝对的,否则无法保证您的分页