SQLサーバーテーブルからランダムレコードを取得する簡潔な方法はありますか?
はい
SELECT TOP 1 * FROM table ORDER BY NEWID()
説明
NEWID()
行ごとにが生成され、テーブルはそれによってソートされます。最初のレコードが返されます(つまり、「最も低い」GUIDを持つレコード)。
メモ
-
バージョン4以降、GUIDは疑似乱数として生成されます:
バージョン4のUUIDは、真にランダムなまたは疑似ランダムな数値からUUIDを生成するためのものです。
アルゴリズムは次のとおりです。
- clock_seq_hi_and_reservedの最上位2ビット(ビット6と7)をそれぞれ0と1に設定します。
- time_hi_and_versionフィールドの最上位4ビット(ビット12〜15)をセクション4.1.3の4ビットバージョン番号に設定します。
- 他のすべてのビットをランダムに(または疑似ランダムに)選択された値に設定します。
-Universally Unique IDentifier(UUID)URN名前空間-RFC 4122
-
代替の
SELECT TOP 1 * FROM table ORDER BY RAND()
思ったようには機能しません。RAND()
クエリごとに1つの値を返すため、すべての行が同じ値を共有します。 -
GUID値は疑似ランダムですが、より要求の厳しいアプリケーションには、より優れたPRNGが必要になります。
-
通常のパフォーマンスは、約1,000,000行で10秒未満です。もちろん、システムによって異なります。インデックスをヒットすることは不可能であるため、パフォーマンスは比較的制限されることに注意してください。