DBMS_RANDOMパッケージを使用してレコードを並べ替えてから、行制限句を使用して目的のサンプルサイズに制限します
dbms_random.value関数は、テーブル内のすべての行について0〜1の乱数を取得し、ランダム値の昇順で並べ替えます。
識別したサンプルセットを作成する方法は次のとおりです。
SELECT
*
FROM
(
SELECT
*
FROM
tbl1
ORDER BY dbms_random.value
)
FETCH FIRST 1000000 ROWS ONLY;
サンプルスキーマテーブルでデモンストレーションするには、emp
、4つのレコードをサンプリングします:
[email protected]> SELECT
2 empno,
3 rnd_val
4 FROM
5 (
6 SELECT
7 empno,
8 dbms_random.value rnd_val
9 FROM
10 emp
11 ORDER BY rnd_val
12 )
13 FETCH FIRST 4 ROWS ONLY;
EMPNO RND_VAL
7698 0.06857749035643605682648168347885993709
7934 0.07529612360785920635181751566833986766
7902 0.13618520865865754766175030040204331697
7654 0.14056380246495282237607922497308953768
[email protected]> SELECT
2 empno,
3 rnd_val
4 FROM
5 (
6 SELECT
7 empno,
8 dbms_random.value rnd_val
9 FROM
10 emp
11 ORDER BY rnd_val
12 )
13 FETCH FIRST 4 ROWS ONLY;
EMPNO RND_VAL
7839 0.00430658806761508024693197916281775492
7499 0.02188116061148367312927392115186317884
7782 0.10606515700372416131060633064729870016
7788 0.27865276349549877512032787966777990909
上記の例では、empno
SQL*Plusコマンドの実行中に大幅に変更されます。
パフォーマンスは、説明している行数の問題である可能性があります。
編集:
テーブルのサイズが150ギガから79MMのオーダーであるため、並べ替えは面倒です。
テーブルに1ずつインクリメントされたシーケンスに基づく代理キーがある場合、キーに基づいてn番目ごとのレコードを選択するアプローチを取ることができます。
例えば
--scenario n = 3000
FROM
tbl1
WHERE
mod(table_id, 3000) = 0;
このアプローチでは(関数ベースのインデックスが作成されない限り)インデックスは使用されませんが、少なくともこのサイズのデータセットに対して並べ替えは実行されません。
8000万件近くのレコードがあるテーブルで説明プランを実行し、全表スキャンを実行します(条件により、関数ベースのインデックスなしでこれが強制されます)が、これは維持可能に見えます。