投稿したクエリで:
select * from <table_name>;
ORDER BYを指定しないため、100行目から200行目のようなものはありません。かなり多くの興味深い理由でORDER BYを含めない限り、順序は保証されませんが、それはここでのポイントではありません。
ポイントを説明するために、テーブルを使用しましょう。StackOverflowデータダンプの Usersテーブルを使用して、このクエリを実行します。
SELECT * FROM dbo.Users ORDER BY DisplayName;
既定では、DisplayNameフィールドにはインデックスがないため、SQL Serverはテーブル全体をスキャンし、DisplayNameで並べ替える必要があります。実行計画は次のとおりです。
それはきれいではありません-それは多くの作業で、推定サブツリーコストは約3万です。(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行にするだけで、コストはまだ約3万です。さらに悪いことに、このリスト全体はクエリを実行するたびに再構築されます(結局、誰かがDisplayNameを変更した可能性があるためです)。
高速化するために、DisplayNameに非クラスター化インデックスを作成できます。これは、特定のフィールドでソートされたテーブルのコピーです。
CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);
そのインデックスを使用して、クエリの実行プランはインデックスシークを実行します。
クエリは即座に終了し、推定サブツリーコストはわずか0.66(30kではない)です。
要約すると、頻繁に実行するクエリをサポートする方法でデータを整理する場合、はい、SQL Serverはショートカットを使用してクエリを高速化できます。一方、ヒープまたはクラスター化インデックスしか持っていない場合は、手間がかかります。