Når jeg låner jonearles' eksempeltabel, ser jeg nøjagtig det samme (i 11gR2 på et OEL-udviklerbillede), som normalt får værdier for a
stærkt skævt mod 1
; med små stikprøvestørrelser kan jeg nogle gange slet ikke se nogen. Med det ekstra randomiserings-/begrænsningstrin, jeg nævnte i en kommentar:
select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
... med tre løb fik jeg:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Ja, 100 % kom virkelig tilbage som 1
på anden kørsel. Selve skævningen ser ud til at være ret tilfældig. Jeg prøvede med block
modifikator, som syntes at gøre en lille forskel, måske overraskende - jeg troede måske, at det ville blive værre i denne situation.
Dette vil sandsynligvis være langsommere, bestemt for små stikprøvestørrelser, da det skal ramme hele bordet; men giver mig ret jævne opdelinger ret konsekvent:
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;
Med tre løb fik jeg:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
... som ser lidt sundere ud. YMMV selvfølgelig.
Denne Oracle-artikel
dækker nogle prøvetagningsteknikker, og du vil måske evaluere ora_hash
tilgang også, og den stratificerede version, hvis dine data spredes og dine krav om 'repræsentativitet' kræver det.