ในแบบสอบถามที่คุณโพสต์:
select * from <table_name>;
ไม่มีสิ่งเช่นแถวที่ 100 ถึง 200 เพราะคุณไม่ได้ระบุ ORDER BY การสั่งซื้อจะไม่รับประกันถ้าคุณไม่ได้รวม ORDER BY ด้วยเหตุผลที่น่าสนใจมากมาย แต่นั่นไม่ใช่จุดที่นี่
ดังนั้นเพื่อแสดงจุดของคุณลองใช้ตาราง - ฉันจะใช้ตารางผู้ใช้จากการถ่ายโอนข้อมูลกองข้อมูลล้นและเรียกใช้แบบสอบถามนี้:
SELECT * FROM dbo.Users ORDER BY DisplayName;
ตามค่าเริ่มต้นไม่มีดัชนีในเขตข้อมูล DisplayName ดังนั้น SQL Server ต้องสแกนตารางทั้งหมดแล้วเรียงลำดับตาม DisplayName นี่คือแผนการดำเนินการ :
มันไม่สวยเลย - มันใช้งานได้ดีมาก, ด้วยราคาทรีย่อยประมาณ 30k (คุณสามารถดูได้โดยการเลื่อนเมาส์ไปเหนือตัวดำเนินการที่เลือกที่ PasteThePlan) จะเกิดอะไรขึ้นหากเราต้องการแถวที่ 100-200 เท่านั้น เราสามารถใช้ไวยากรณ์นี้ใน SQL Server 2012+:
SELECT * FROM dbo.Users ORDER BY DisplayName OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
แผนการดำเนินการที่น่าเกลียดเกินไป:
SQL Server ยังคงสแกนตารางทั้งหมดเพื่อสร้างรายการที่เรียงลำดับเพื่อให้แถว 100-200 ของคุณและค่าใช้จ่ายยังอยู่ที่ประมาณ 30k ยิ่งกว่านั้นรายการทั้งหมดนี้จะถูกสร้างขึ้นใหม่ทุกครั้งที่มีการเรียกใช้คิวรีของคุณ (เพราะหลังจากนั้นบางคนอาจเปลี่ยน DisplayName ของพวกเขา)
เพื่อให้เร็วขึ้นเราสามารถสร้างดัชนีแบบไม่รวมกลุ่มบน DisplayName ซึ่งเป็นสำเนาของตารางของเราเรียงลำดับตามฟิลด์เฉพาะนั้น:
CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);
ด้วยดัชนีนั้นขณะนี้แผนการดำเนินการค้นหาของเราจะค้นหาดัชนี:
การค้นหาเสร็จสิ้นทันทีและมีค่าใช้จ่ายทรีย่อยโดยประมาณเพียง 0.66 (เมื่อเทียบกับ 30k)
โดยสรุปหากคุณจัดระเบียบข้อมูลในลักษณะที่สนับสนุนการสืบค้นที่คุณเรียกใช้บ่อยๆใช่แล้ว SQL Server สามารถใช้ทางลัดเพื่อทำให้การสืบค้นของคุณเร็วขึ้น หากในอีกทางหนึ่งสิ่งที่คุณมีก็คือฮีปหรือดัชนีคลัสเตอร์คุณจะเมา