SQL Serverでランダムに行を抽出する

 


SQL Serverでは、ORDER BYNEWID()を使うと、行をランダムな順序に並べ替えることができます。TOP 10のように指定すれば、その行数分だけをランダムに取得できます。

SELECT TOP 10 *
FROM SomeTable
ORDER BY NEWID();

ただし、行数の多いテーブルに対してこの方法を使うと、処理コストが高くなります。全行に対してランダムな値を生成し、その結果を並べ替える必要があるためです。

このような場合は、TABLESAMPLEを使うことで、ある程度処理コストを抑えられます。ただし、TABLESAMPLEはページ単位でデータを取得するため、行単位で完全にランダムに抽出されるわけではありません。また、指定した行数が必ず取得されるとは限りません。

そのため、実際に取得したい行数よりも多めに候補を取得し、その候補に対してORDER BY NEWID()を使う方法が考えられます。

WITH candidates AS (
    SELECT *
    FROM SomeTable TABLESAMPLE (1000 ROWS)
)
SELECT TOP 10 *
FROM candidates
ORDER BY NEWID();

この方法であれば、全件を並べ替える場合に比べて処理コストを抑えつつ、ランダムに近い抽出ができます。

NEWID(Transact-SQL) - SQL Server | Microsoft Learn


HM

インプラス株式会社