モノノフ日記

普通の日記です

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秒
  • SAMPLE使う方法

  • SELECT WORD FROM TEST SAMPLE(5) WHERE ROWNUM <= 10;

    実行時間:0.00369733秒

これは驚き!こんな便利な関数があるのは知らなかったです。

ただ参照元によると高速に動作する分、制限事項もあるようなので注意する必要がありますね。