När jag lånar jonearles exempeltabell ser jag exakt samma sak (i 11gR2 på en OEL-utvecklarbild), vanligtvis får jag värden för a
kraftigt sned mot 1
; med små provstorlekar kan jag ibland inte se några alls. Med det extra randomiserings-/begränsningssteget jag nämnde 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öpningar fick jag:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Ja, 100 % kom verkligen tillbaka som 1
på andra åket. Själva snedställningen verkar vara ganska slumpmässig. Jag försökte med block
modifierare som verkade göra liten skillnad, kanske överraskande - jag kanske trodde att det skulle bli värre i den här situationen.
Detta kommer sannolikt att gå långsammare, särskilt för små urvalsstorlekar, eftersom det måste träffa hela tabellen; men ger mig ganska jämna delningar ganska 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öpningar fick jag:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
... som ser lite hälsosammare ut. YMMV såklart.
Denna Oracle-artikel
täcker vissa samplingstekniker, och du kanske vill utvärdera ora_hash
tillvägagångssätt också, och den stratifierade versionen om din data sprids och dina krav på "representativitet" kräver det.