41

このクエリを実行すると

select top 100 * from mytable order by newid()

私のテーブルから100個のランダムなレコードを取得します。

newid()ただし、リストに表示されないため、どのように機能するかについて少し混乱していselectます。誰か説明できますか?ここに何か特別なことがありnewid()ますか?

4

6 に答える 6

34

私は NewID() が何をするか知っています。ランダムな選択にどのように役立つかを理解しようとしています。(1) select ステートメントは mytable からすべてを選択し、(2) 選択された行ごとに、NewID() によって生成された uniqueidentifier を追加し、(3) この uniqueidentifier で行をソートし、(4) 一番上を選択します。ソートされたリストから100?

はい。これはほぼ正確です (ただし、すべての行を並べ替える必要はありません)。これは、実際の実行計画を見ることで確認できます。

SELECT TOP 100 * 
FROM master..spt_values 
ORDER BY NEWID()

計算スカラー演算子は、NEWID()行ごとに列を追加します (私の例のクエリのテーブルでは 2506)。次に、テーブルの行はこの列で並べ替えられ、上位 100 が選択されます。

SQL Server は実際にはセット全体を位置 100 から下に並べ替える必要はないためTOP N、メモリ内で並べ替え操作全体を実行しようとする並べ替え演算子を使用します (の小さい値の場合N) 。

プラン

于 2011-02-12T21:25:51.400 に答える
11

一般に、次のように機能します。

  • mytableのすべての行が「ループ」されます
  • NEWID() は行ごとに実行されます
  • 行は NEWID() の乱数に従ってソートされます
  • 最初の 100 行が選択されています
于 2011-02-12T21:20:56.693 に答える
4

MSDNが言うように:

NewID() uniqueidentifier 型の一意の値を作成します。

テーブルはこのランダムな値でソートされます。

于 2011-02-12T18:30:34.833 に答える