クエリ 1 = ITEMS i から上位 5 つの i.item_id を選択
クエリ 2 = ITEMS i から上位 5 つの i.item_id、i.category_id を選択
上位 5 つの句を削除しても、異なる行が返されます。
「select top 5 i.* from ITEMS i」を実行すると、まったく異なる結果セットが返されます!!
クエリ 1 = ITEMS i から上位 5 つの i.item_id を選択
クエリ 2 = ITEMS i から上位 5 つの i.item_id、i.category_id を選択
上位 5 つの句を削除しても、異なる行が返されます。
「select top 5 i.* from ITEMS i」を実行すると、まったく異なる結果セットが返されます!!
ORDER BY 句がない場合、「TOP N」で修飾された SELECT の結果は不確定になるためです。
句がないORDER BYと、結果が得られる順序を予測できません。SQL Serverがこれらのクエリを異なる方法で処理するのには、おそらく興味深い根本的な理由がありますが、ユーザーの観点から見ると、解決策はORDER BY、クエリに関連する句を課すことです。これにより、どの5つの項目が最初に来るかが確実にわかります。
ORDER BY句を指定していないため、オプティマイザは、要求しているクエリを実行するための最も効率的な方法を決定します。これは、2つのクエリで指定した2つの列に対して異なるインデックスが作成される可能性があることを意味します。これにより、表示される内容が得られます。
理由は単純です。ORDERBY句を指定しなかったためです。したがって、たとえば、オプティマイザは2つの異なるクエリを満たすために異なるインデックスを使用することを選択できます。ItemIDを含むがCategoryIDを含まないリーンインデックスがある場合、最初のクエリを満たすためにタッチできます。非常に一般的な質問ですが、缶詰のnaswerがあります。