2008-10-04 40 views
5

EDIT:Tôi vẫn đang chờ thêm câu trả lời. Cảm ơn!Phương pháp phân trang hiệu quả thông qua bộ kết quả rất lớn trong SQL Server 2005 là gì?

Trong SQL 2000 ngày, tôi sử dụng để sử dụng bảng phương pháp tạm thời mà bạn tạo ra một bảng tạm thời với cột sắc mới và khóa chính sau đó chọn nơi cột sắc giữa A và B.

Khi SQL 2005 đến dọc theo tôi phát hiện ra khoảng Row_Number() và tôi đã sử dụng nó kể từ ...

Nhưng bây giờ, tôi đã tìm thấy vấn đề về hiệu suất nghiêm trọng với Row_Number(). Nó hoạt động rất tốt khi bạn đang làm việc với các tập kết quả không quá lớn và sắp xếp trên một cột nhận dạng. Tuy nhiên, nó hoạt động rất kém khi bạn đang làm việc với tập hợp kết quả lớn như hơn 10.000 bản ghi và phân loại nó trên cột không nhận dạng. Row_Number() hoạt động kém ngay cả khi bạn sắp xếp theo cột nhận dạng nếu tập hợp kết quả là hơn 250.000 bản ghi. Đối với tôi, nó đến một điểm mà nó ném một lỗi, "timeout lệnh!"

gì bạn sử dụng để làm phân trang kết quả lớn đặt trên SQL 2005? Phương pháp bảng tạm thời vẫn tốt hơn trong trường hợp này? Tôi không chắc chắn nếu phương pháp này using temp table with SET ROWCOUNT sẽ hoạt động tốt hơn ... Nhưng một số người nói rằng có vấn đề về việc đưa ra số hàng sai nếu bạn có khóa chính nhiều cột.

Trong trường hợp của tôi, tôi cần có khả năng sắp xếp tập hợp kết quả theo cột loại ngày ... cho ứng dụng web sản xuất của tôi.

Hãy cho tôi biết những gì bạn sử dụng cho phân trang hiệu suất cao trong SQL 2005. Và tôi cũng muốn biết một cách thông minh để tạo các chỉ mục. Tôi nghi ngờ việc chọn đúng các khóa chính và/hoặc chỉ mục (được nhóm/không được nhóm) sẽ đóng một vai trò lớn ở đây.

Xin cảm ơn trước.

P.S. Có ai biết stackoverflow sử dụng gì không?

EDIT: Mine trông giống như ...

SELECT postID, postTitle, postDate 
FROM 
    (SELECT postID, postTitle, postDate, 
     ROW_NUMBER() OVER(ORDER BY postDate DESC, postID DESC) as RowNum 
    FROM MyTable 
    ) as DerivedMyTable 
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1 

postID: Int, Identity (auto-increment), Primary key

ghi lùi: DateTime

EDIT: Có phải tất cả mọi người đang sử dụng Row_Number() không?

Trả lời

0

Vâng, đối với truy vấn mẫu ROW_COUNT của bạn nên khá nhanh với hàng nghìn hàng, miễn là bạn có chỉ mục trên trường PostDate của mình. Nếu không, máy chủ cần thực hiện quét chỉ mục nhóm hoàn chỉnh trên PK của bạn, thực tế tải mọi trang, tìm trường PostDate của bạn, sắp xếp theo nó, xác định các hàng cần trích xuất cho tập kết quả và tìm nạp lại các hàng đó. Đó là loại tạo ra một chỉ số tạm thời hơn và hơn nữa (bạn có thể thấy một bảng/chỉ số ống chỉ trong đồng bằng).

Không có gì lạ khi bạn hết thời gian chờ.

Đề nghị của tôi: thiết lập một chỉ mục trên ghi lùi DESC, đây là những gì ROW_NUMBER sẽ đi qua - (ORDER BY ghi lùi DESC, ...)

Đối với bài viết bạn đang đề cập đến - tôi đã thực hiện khá nhiều phân trang và các công cụ với SQL Server 2000 trong quá khứ mà không ROW_COUNT và cách tiếp cận được sử dụng trong bài viết là hiệu quả nhất. Nó không hoạt động trong mọi trường hợp (bạn cần các giá trị duy nhất hoặc gần như duy nhất). Tổng quan về một số phương pháp khác là here.

.

7

Kỹ thuật row_number() sẽ nhanh chóng. Tôi đã thấy kết quả tốt cho 100.000 hàng.

Bạn đang sử dụng row_number() tương tự như sau:

SELECT column_list 
FROM 
    (SELECT column_list 
     ROW_NUMBER() OVER(ORDER BY OrderByColumnName) as RowNum 
    FROM MyTable m 
    ) as DerivedTableName 
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1 

... và làm bạn có một chỉ số bao phủ cho column_list và/hoặc một chỉ mục trên cột 'OrderByColumnName'?

+0

Cảm ơn bạn đã nhập. Tôi đã cập nhật câu hỏi của mình. –

Các vấn đề liên quan