Trong truy vấn bạn đã đăng:
select * from <table_name>;
Không có thứ gọi là hàng thứ 100-200, vì bạn không chỉ định ĐẶT HÀNG B .NG. Đơn hàng không được đảm bảo trừ khi bạn bao gồm ĐẶT HÀNG B forNG vì nhiều lý do thú vị, nhưng đó không thực sự là vấn đề ở đây.
Vì vậy, để minh họa quan điểm của bạn, hãy sử dụng bảng - Tôi sẽ sử dụng bảng Người dùng từ kết xuất dữ liệu Stack Overflow và chạy truy vấn này:
SELECT * FROM dbo.Users ORDER BY DisplayName;
Theo mặc định, không có chỉ mục trên trường DisplayName, vì vậy SQL Server phải quét toàn bộ bảng, sau đó sắp xếp nó theo DisplayName. Đây là kế hoạch thực hiện :
Nó không đẹp - đó là rất nhiều công việc, với chi phí phụ ước tính khoảng 30k. (Bạn có thể thấy nó bằng cách di chuột qua toán tử đã chọn tại PasteThePlan.) Vậy điều gì xảy ra nếu chúng ta chỉ muốn các hàng 100-200? Chúng tôi có thể sử dụng cú pháp này trong SQL Server 2012+:
SELECT * FROM dbo.Users ORDER BY DisplayName OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
Kế hoạch thực hiện trên đó cũng khá xấu xí:
SQL Server vẫn đang quét toàn bộ bảng để xây dựng danh sách được sắp xếp chỉ để cung cấp cho bạn các hàng 100-200 của bạn và chi phí vẫn khoảng 30k. Thậm chí tệ hơn, toàn bộ danh sách này sẽ được xây dựng lại mỗi khi truy vấn của bạn chạy (vì sau tất cả, ai đó có thể đã thay đổi DisplayName của họ.)
Để làm cho nó đi nhanh hơn, chúng ta có thể tạo một chỉ mục không bao gồm trên DisplayName, một bản sao của bảng của chúng tôi, được sắp xếp theo trường cụ thể đó:
CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);
Với chỉ mục đó, kế hoạch thực hiện truy vấn của chúng tôi hiện tìm kiếm chỉ mục:
Truy vấn kết thúc ngay lập tức và có chi phí phụ ước tính chỉ 0,66 (trái ngược với 30k).
Tóm lại, nếu bạn sắp xếp dữ liệu theo cách hỗ trợ các truy vấn bạn thường chạy, thì có, SQL Server có thể sử dụng các phím tắt để truy vấn của bạn nhanh hơn. Mặt khác, nếu tất cả những gì bạn có là đống hoặc chỉ mục cụm, bạn bị vặn.