Trước hết, hãy nghĩ về điều này như thế này: hiển thị 1 triệu bản ghi hoàn toàn không có ý nghĩa với bất kỳ người dùng nào. Vì vậy, bạn phải suy nghĩ về những gì người dùng mong đợi để xem. Có lẽ một bản tóm tắt ?! Có thể phân trang các bản ghi trong các trang có 25 hoặc 50 hoặc 100 bản ghi. Một trong những cách tiếp cận này sẽ không yêu cầu bạn giữ 1 bản ghi M tại một thời điểm trong bộ nhớ.
Ngoài ra, khi bạn chạy truy vấn đối với cơ sở dữ liệu SQL và sử dụng SqlDataReader bạn sẽ không nhận được tất cả bản ghi mà thay vào đó trình điều khiển SQL sẽ gửi truy vấn đến máy chủ SQL, máy chủ sẽ thực hiện truy vấn, tập hợp kết quả và tạo con trỏ chỉ chuyển tiếp trên máy chủ. Sau đó, trình điều khiển sẽ lấy một bản ghi tại một thời điểm, mỗi khi bạn gọi Đọc() trên SqlDataReader của bạn. Hành vi này rất giống nhau nếu bạn sử dụng LINQ to SQL trong đó sử dụng thực thi hoãn lại. Tập kết quả không được chuyển giao đầy đủ cho đến khi (hoặc trừ khi) bạn yêu cầu cụ thể từng hàng.
Vì vậy, truy vấn phân trang đơn giản sẽ thực hiện thủ thuật. Hoặc trong các trường hợp khác, một số loại báo cáo tóm tắt tổng hợp dữ liệu từ 1 triệu bản ghi này một hoặc hai trang dữ liệu có liên quan. Tất nhiên nếu bạn cần di chuyển qua lại giữa các trang, một số loại bộ nhớ đệm có thể có ý nghĩa nhưng một lần nữa, hãy nghĩ về nó: tần suất người dùng thực sự muốn duyệt qua 1 triệu bản ghi - có lẽ không bao giờ. Lưu ý cuối cùng, nếu bạn thực hiện phân trang - hãy đảm bảo rằng phương pháp bạn sử dụng để triển khai phân trang dựa trên máy chủ SQL gửi dữ liệu một trang tại một thời điểm và không đọc tất cả 1 triệu bản ghi vào ASP.NET và sau đó phân trang bản sao dữ liệu cục bộ bởi vì điều đó sẽ rất kém hiệu quả và chậm. Dưới đây là ví dụ về truy vấn SQL Server thực hiện phân trang: SO Question #109232
Nguồn
2010-10-16 17:33:28
Tôi chỉ đang cố gắng tìm ra nếu có đủ giờ trong ngày để trang qua hàng triệu hàng dữ liệu. chúng ta hãy nói 40 hàng trên mỗi trang để 25.000 trang cần thiết, nói 1 phút duyệt mỗi trang sẽ là 25.000 phút hoặc khoảng 17 ngày - eeeek –
Nó hoàn toàn không có ý nghĩa để hiển thị một triệu hồ sơ nếu bạn hỏi tôi. Kịch bản ở đây là gì? –
Là một sang một bên, giả sử hồ sơ của bạn có trung bình 150 byte (đó là giống như một tên, một mô tả ngắn, một vài ints và một vài bools). 1 triệu bản ghi sẽ nhỏ hơn 150MB. Không thực sự quá nhiều để lưu trữ trong bộ nhớ cache. Tuy nhiên, cần lưu ý rằng máy chủ cơ sở dữ liệu của bạn (có thể là SQL Server) đã làm bộ nhớ đệm. Trong thực tế, nếu các truy vấn như vậy là phổ biến và bạn có rất nhiều bộ nhớ, tôi nghĩ rằng có thể toàn bộ bảng nằm trong bộ nhớ. – tster