Tôi muốn thực hiện bảng phân trang sử dụng phương pháp này:Có vấn đề về hiệu suất nào khi sử dụng Row_Number để triển khai phân trang bảng trong Sql Server 2008 không?
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;
Có điều gì tôi cần phải nhận thức? Bảng có hàng triệu hồ sơ.
Thx.
EDIT: Sau khi sử dụng gợi ý MAXROWS
phương pháp trong một thời gian (trong đó hoạt động thực sự rất nhanh) Tôi đã phải chuyển về ROW_NUMBER
phương pháp vì sự linh hoạt hơn của nó. Tôi cũng rất hài lòng về tốc độ của nó cho đến nay (Tôi đang làm việc với View có nhiều hơn 1 triệu hồ sơ với 10 cột). Để sử dụng bất kỳ loại truy vấn nào tôi sử dụng sửa đổi sau đây:
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
Nếu bạn sử dụng quy trình này, hãy chắc chắn rằng bạn đã ngăn chặn tiêm sql.
Trùng lặp chính xác: http://stackoverflow.com/questions/1897436/row-number-over-not-fast-enough-with-large-result-set-any-good-solution –
Pony, tôi không phải là rất hài lòng với câu trả lời đó, chủ yếu là bởi vì nó thậm chí không đề cập đến Row_Number() ..... Câu hỏi đặt ra, một lần nữa: Tôi đang sử dụng Row_Number().Những gì bạn có thể cho tôi biết về hiệu quả của nó so với một phương pháp khác (vì vậy, không cung cấp cho tôi một phương pháp khác) – majkinetor
BTW, Pony Tôi nhận xét như thế này rất thô lỗ. Tôi chắc rằng tôi biết câu trả lời hay cho câu hỏi của tôi là gì, tôi không cần phải nói với tôi điều đó. Amdin BS điển hình. – majkinetor