Използвайте пакета 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 гигабайта - 79 MM всяко сортиране би било болезнено.
Ако таблицата имаше сурогатен ключ, базиран на последователност, увеличена с 1, бихме могли да приемем подхода на избиране на всеки n-ти запис въз основа на ключа.
напр.
--scenario n = 3000
FROM
tbl1
WHERE
mod(table_id, 3000) = 0;
Този подход няма да използва индекс (освен ако не е създаден базиран на функция индекс), но поне не извършваме сортиране на набор от данни с такъв размер.
Изпълних план за обяснение с таблица, която има близо 80 милиона записа и тя извършва пълно сканиране на таблица (условието налага това без базиран на функция индекс), но това изглежда приемливо.