Użyj pakietu DBMS_RANDOM do sortowania rekordów, a następnie użyj klauzuli ograniczającej wiersze, aby ograniczyć do żądanego rozmiaru próbki
Funkcja dbms_random.value pobiera losową liczbę od 0 do 1 dla wszystkich wierszy w tabeli i sortujemy w kolejności rosnącej losowej wartości.
Oto jak wyprodukować zidentyfikowany zestaw próbek:
SELECT
*
FROM
(
SELECT
*
FROM
tbl1
ORDER BY dbms_random.value
)
FETCH FIRST 1000000 ROWS ONLY;
Aby zademonstrować z przykładową tabelą schematu, emp
, próbkujemy 4 rekordy:
[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
W powyższym przykładzie zauważ, że empno
zmienia się znacząco podczas wykonywania polecenia SQL*Plus.
Wydajność może być problemem z liczbą wierszy, które opisujesz.
EDYTUJ:
Przy rozmiarach stołów rzędu 150 g - 79 MM każde sortowanie byłoby bolesne.
Gdyby tabela miała klucz zastępczy oparty na sekwencji zwiększonej o 1, moglibyśmy wybrać co n-ty rekord na podstawie klucza.
np.
--scenario n = 3000
FROM
tbl1
WHERE
mod(table_id, 3000) = 0;
To podejście nie wykorzystuje indeksu (chyba że zostanie utworzony indeks oparty na funkcji), ale przynajmniej nie wykonujemy sortowania na zbiorze danych o takim rozmiarze.
Przeprowadziłem plan wyjaśniania z tabelą, która ma blisko 80 milionów rekordów i wykonuje pełne skanowanie tabeli (warunek wymusza to bez indeksu opartego na funkcjach), ale wygląda to na możliwe do utrzymania.