Když jsem si vypůjčil jonearlesovu ukázkovou tabulku, vidím přesně to samé (v 11gR2 na obrázku vývojáře OEL), obvykle získávám hodnoty pro a
silně vychýlená směrem k 1
; u malých vzorků někdy nevidím vůbec žádné. S dalším krokem randomizace/omezení, který jsem zmínil v komentáři:
select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
... se třemi běhy jsem dostal:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Ano, 100 % se skutečně vrátilo jako 1
při druhém běhu. Samotné zkreslení se zdá být spíše náhodné. Zkusil jsem to pomocí block
modifikátor, který se zdál mít malý rozdíl, možná překvapivě - mohl jsem si myslet, že se to v této situaci zhorší.
To bude pravděpodobně pomalejší, určitě pro malé velikosti vzorků, protože musí zasáhnout celou tabulku; ale dává mi docela rovnoměrné rozdělení poměrně konzistentně:
select a, count(*) from (
select a, b from (
select a, b, row_number() over (order by dbms_random.value) as rn
from test1
)
where rn < 101
)
group by a;
Se třemi běhy jsem dostal:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
... což vypadá o něco zdravěji. YMMV samozřejmě.
Tento článek Oracle
pokrývá některé techniky vzorkování a možná budete chtít vyhodnotit ora_hash
přístup také a stratifikovanou verzi, pokud se vaše data šíří a vaše požadavky na „reprezentativnost“ to vyžadují.