Použijte balíček DBMS_RANDOM k seřazení záznamů a poté použijte klauzuli omezující řádky k omezení na požadovanou velikost vzorku
Funkce dbms_random.value získá náhodné číslo mezi 0 a 1 pro všechny řádky v tabulce a seřadíme je vzestupně podle náhodné hodnoty.
Zde je návod, jak vytvořit vzorovou sadu, kterou jste identifikovali:
SELECT
*
FROM
(
SELECT
*
FROM
tbl1
ORDER BY dbms_random.value
)
FETCH FIRST 1000000 ROWS ONLY;
Chcete-li demonstrovat s ukázkovou tabulkou schématu, emp
, vzorujeme 4 záznamy:
[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
U výše uvedeného příkladu si všimněte, že empno
se výrazně změní během provádění příkazu SQL*Plus.
Výkon může být problém s počty řádků, které popisujete.
UPRAVIT:
S velikostí tabulek v řádu 150 giga – 79 MM by jakékoli třídění bylo bolestivé.
Pokud by tabulka měla náhradní klíč založený na sekvenci zvýšené o 1, mohli bychom zvolit přístup výběru každého n-tého záznamu na základě klíče.
např.
--scenario n = 3000
FROM
tbl1
WHERE
mod(table_id, 3000) = 0;
Tento přístup by nepoužíval index (pokud není vytvořen index založený na funkcích), ale alespoň neprovádíme třídění na množině dat této velikosti.
Provedl jsem plán vysvětlení s tabulkou, která má téměř 80 milionů záznamů a provádí úplné prohledání tabulky (podmínka si to vynutí bez indexu založeného na funkcích), ale vypadá to udržitelně.