Oracleで全レコードからランダムに行を取得
Oracleでランダムにレコードを取得するの劇的に早い方法がありました。
今までは乱数発生させてソートしていたのが関数1つで済むようになります。
テーブル・データをランダムサンプリングする - Oracle/オラクルをマスターするための基本と仕組みで紹介されています。
SAMPLEという関数を使うことで速度が劇的に早くなりました。
関数の説明はリンク先を参照して頂くとして実際にベンチを計ってみました。
約40万レコードのテーブルから10行をランダムに取得するSQLで計測しました。
- SAMPLE使わない方法
SELECT WORD
FROM
(SELECT dbms_random.random() as rand, WORD FROM TEST ORDER BY rand)
WHERE ROWNUM <= 10;
実行時間: 3.11698914秒
SELECT WORD FROM TEST SAMPLE(5) WHERE ROWNUM <= 10;
実行時間:0.00369733秒
これは驚き!こんな便利な関数があるのは知らなかったです。
ただ参照元によると高速に動作する分、制限事項もあるようなので注意する必要がありますね。