Làm thế nào để thực hiện phân trang một cách hiệu quả?


9

Tôi có một truy vấn cơ sở dữ liệu có thể dẫn đến một tập kết quả lớn. Máy khách hiển thị dữ liệu nhận dữ liệu qua mạng, do đó, ý tưởng là giảm thiểu lượng dữ liệu được truyền bằng cách chỉ lấy 50 kết quả đầu tiên từ cơ sở dữ liệu và gửi chúng đến máy khách. Sau đó, tôi sẽ cung cấp khả năng chuyển sang trang thứ hai để lấy 50 kết quả tiếp theo, v.v. (một cái gì đó tương tự như google cung cấp)

Câu hỏi đặt ra là cách hiệu quả để thực hiện phân trang. Tôi muốn đảm bảo rằng mssql sử dụng bộ nhớ cache càng nhiều càng tốt và điều tương tự không được thực hiện một lần nữa mỗi khi tôi thay đổi phân trang.

Có nhiều khách hàng đang truy vấn cơ sở dữ liệu cùng một lúc. Công cụ sql đã sử dụng: MS SQL 2005

Ý tưởng của tôi là:

  • Sử dụng stHRenst chuẩn bị để đảm bảo chia sẻ kế hoạch thực hiện
  • sử dụng biến ROW_COUNT để chỉ truy xuất các hàng cần thiết

Nhưng nó có thực sự là cách hiệu quả nhất? Hoặc bạn có nghĩ rằng sẽ tốt hơn nếu lấy toàn bộ tập kết quả và thực hiện phân trang trong mã gửi dữ liệu đến máy khách?

Cảm ơn bạn cho lời khuyên của bạn!

Trân trọng, Tomas

Câu trả lời:


7

Truy vấn sẽ được thực hiện mỗi lần. SQL Server không lưu trữ kết quả.

Phân trang đúng sẽ không được triển khai cho đến SQL Server 2011, nhưng cho đến lúc đó các tùy chọn của bạn (như bạn đã xác định) là:

  • ROW_NUMBER () và truy vấn theo yêu cầu
  • bộ nhớ đệm của khách hàng

Một câu lệnh SQL đã chuẩn bị cũng sẽ được thực thi.

Nếu bạn có một máy khách béo thì bộ nhớ đệm là cục bộ cho máy khách. Điều này chủ yếu là OK trừ khi bạn có hàng triệu đốm màu chẳng hạn.

Trong ứng dụng web của chúng tôi, chúng tôi hiển thị tất cả các kết quả nhưng chỉ hiển thị top 100 và có nút "Hiển thị tất cả" hơn là mở rộng DIV ẩn với các hàng 101+. Chúng tôi không lưu trữ trong máy chủ web và chúng tôi không cung cấp phân trang.


Cảm ơn. Và cách tiếp cận tốt hơn là gì nếu người dùng thay đổi một số tiêu chí sắp xếp? Tôi có nên thực hiện truy vấn một lần nữa với tiêu chí mới hoặc sắp xếp kết quả trên máy khách không?
Tomas Walek

1
Tôi sẽ sắp xếp trong khách hàng. Dữ liệu đã có. Có, một cơ sở dữ liệu tốt trong việc sắp xếp nhưng nếu dữ liệu giống nhau và có sẵn tại sao thực hiện cuộc gọi khác? Chúng tôi sử dụng tiện ích jQuery để cho phép sắp xếp trong trình duyệt :-)
gbn

4

Nó phụ thuộc vào môi trường của bạn. Tôi sẽ thiết lập một thử nghiệm bằng cả hai phương pháp và xem phương pháp nào phù hợp nhất với bạn. Cá nhân, tôi sẽ trang trên máy chủ. Càng ít dữ liệu qua dây và càng ít dữ liệu trong RAM của khách hàng thì càng tốt. Nếu bạn có thể kiểm soát thông số kỹ thuật của máy khách, tất cả lưu lượng truy cập qua mạng LAN không bão hòa và máy khách luôn chuyển qua nhiều trang một cách nhanh chóng, thì bạn có thể muốn trang tại máy khách.


Cảm ơn. Tôi thực sự cần cả hai: giao tiếp giữa máy chủ và máy khách được triển khai trong WCF, do đó, có một kích thước tối đa cho một tin nhắn và nếu tập kết quả vượt quá kích thước này, tôi phải gửi thêm tin nhắn để chuyển dữ liệu hoàn chỉnh đến máy khách. Các khách hàng cũng thích nhanh chóng lướt qua nhiều trang ... :(
Tomas Walek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.