gpt4 book ai didi

sql-server - 在Sql Server 2008中使用Row_Number实现表分页是否存在性能问题?

转载 作者:行者123 更新时间:2023-12-02 07:45:40 31 4
gpt4 key购买 nike

我想用这个方法实现表格分页:

SET @PageNum = 2;
SET @PageSize = 10;

WITH OrdersRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
,*
FROM dbo.Orders
)

SELECT *
FROM OrdersRN
WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1
AND @PageNum * @PageSize
ORDER BY OrderDate ,OrderID;

有什么我应该注意的吗?表有数百万条记录。

谢谢。

编辑:使用建议的 MAXROWS 方法一段时间后(效果非常非常快),我不得不切换回 ROW_NUMBER 方法,因为它具有更大的灵 active 。到目前为止,我也对其速度感到非常满意(我正在使用具有超过 100 万条记录和 10 列的 View)。要使用任何类型的查询,我使用以下修改:

PROCEDURE [dbo].[PageSelect] 
(
@Sql nvarchar(512),
@OrderBy nvarchar(128) = 'Id',
@PageNum int = 1,
@PageSize int = 0
)
AS
BEGIN
SET NOCOUNT ON

Declare @tsql as nvarchar(1024)
Declare @i int, @j int

if (@PageSize <= 0) OR (@PageSize > 10000)
SET @PageSize = 10000 -- never return more then 10K records

SET @i = (@PageNum - 1) * @PageSize + 1
SET @j = @PageNum * @PageSize

SET @tsql =
'WITH MyTableOrViewRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS RowNum
,*
FROM MyTableOrView
WHERE ' + @Sql + '

)
SELECT *
FROM MyTableOrViewRN
WHERE RowNum BETWEEN ' + CAST(@i as varchar) + ' AND ' + cast(@j as varchar)

exec(@tsql)
END

如果您使用此过程,请确保您阻止了 SQL 注入(inject)。

最佳答案

实际上我已经写过几次关于这个问题的文章了; ROW_NUMBER 是迄今为止最灵活且易于使用的,并且性能良好,但对于极大的数据集,它并不总是最好嗯>。 SQL Server 仍然需要对数据进行排序,而且排序的成本可能会相当高。

有一个different approach here它使用几个变量和 SET ROWCOUNT ,并且速度非常快,只要您有正确的索引。它很旧,但据我所知,它仍然是最有效的。基本上,您可以使用 SET ROWCOUNT 执行完全简单的 SELECT,SQL Server 能够优化大部分实际工作;计划和成本最终类似于两个 MAX/MIN 查询,这通常比单个窗口查询要快得多。对于非常大的数据集,运行时间不到 1/10。

话虽如此,当人们询问如何实现分页或分组最大值之类的东西时,我仍然总是推荐 ROW_NUMBER,因为它非常容易使用。只有当您开始注意到 ROW_NUMBER 速度变慢时,我才会开始考虑上述替代方案。

关于sql-server - 在Sql Server 2008中使用Row_Number实现表分页是否存在性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2308220/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com