msdnのドキュメントには、次のように書かれています。
SELECT TOP(N) ..... ORDER BY [COLUMN]
column
(asc
またはdesc
選択した内容に応じて)ソートされた上位(n)行を取得します
ただし、順序を指定しない場合、msdn はここでrandom
指摘Gail Erickson
したように言います。彼が指摘するように、それはむしろそうであるべきです。しかし、そこで指摘されているようにunspecified
random
Thomas Lee
TOP を ORDER BY 句と組み合わせて使用すると、結果セットは順序付けされた最初の N 行に制限されます。それ以外の場合は、最初の N 行の ramdom を返します
したがって、インデックスを持たないテーブルでこのクエリを実行しました。最初にこれを実行しました..
SELECT *
FROM
sys.objects so
WHERE
so.object_id NOT IN (SELECT si.object_id
FROM
sys.index_columns si)
AND so.type_desc = N'USER_TABLE'
そして、それらのテーブルの1つで(実際、上記のクエリによって返されたすべてのテーブルで以下のクエリを試しました)、常に同じ行を取得しました。
SELECT TOP (2) *
FROM
MstConfigSettings
これは常に同じ 2 行を返し、クエリ 1 によって返される他のすべてのテーブルにも同じことが当てはまります。実行計画は 3 つのステップを示しています。
ご覧のとおり、インデックス ルックアップはなく、純粋なテーブル スキャンであり、
はTop
、実際の行数が 2 であることを示していTable Scan
ます。そうではありません(多くの行があります)。
しかし、次のようなものを実行すると
SELECT TOP (2) *
FROM
MstConfigSettings
ORDER BY
DefaultItemId
実行計画が表示されます
と
そのため、適用しない場合ORDER BY
は手順が異なります (並べ替えはありません)。しかし、問題は、何TOP
もないときにこれがどのように機能Sort
し、なぜ、どのようにして常に同じ結果が得られるのかということです.