Pożyczając przykładową tabelę jonearles, widzę dokładnie to samo (w 11gR2 na obrazie programisty OEL), zwykle otrzymując wartości dla a
mocno przekrzywiony w kierunku 1
; przy małych rozmiarach próbek czasami nie widzę w ogóle żadnego. Z dodatkowym etapem randomizacji/ograniczenia, o którym wspomniałem w komentarzu:
select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
... z trzema biegami mam:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Tak, 100% naprawdę wróciło jako 1
w drugim biegu. Samo przekrzywienie wydaje się być raczej przypadkowe. Próbowałem z block
modyfikator, który wydawał się nie mieć większego znaczenia, być może zaskakująco – mógłbym sądzić, że w tej sytuacji będzie gorzej.
Będzie to prawdopodobnie wolniejsze, z pewnością dla małych rozmiarów próbek, ponieważ musi trafić na cały stół; ale daje mi dość równe podziały dość konsekwentnie:
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;
Z trzema biegami mam:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
…co wygląda trochę zdrowiej. YMMV oczywiście.
Ten artykuł Oracle
obejmuje niektóre techniki próbkowania i możesz chcieć ocenić ora_hash
podejście, a także wersja warstwowa, jeśli Twoje dane się rozprzestrzeniają i wymagają tego wymagania dotyczące „reprezentatywności”.