En empruntant le tableau d'exemple de jonearles, je vois exactement la même chose (en 11gR2 sur une image de développeur OEL), obtenant généralement des valeurs pour a
fortement biaisé vers 1
; avec de petits échantillons, je peux parfois n'en voir aucun. Avec l'étape supplémentaire de randomisation/restriction que j'ai mentionnée dans un commentaire :
select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
... avec trois exécutions, j'ai :
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Oui, 100 % sont vraiment revenus sous la forme 1
à la deuxième manche. L'inclinaison elle-même semble plutôt aléatoire. J'ai essayé avec le block
modificateur qui semblait faire peu de différence, peut-être étonnamment - j'aurais pu penser que cela empirerait dans cette situation.
Cela est susceptible d'être plus lent, certainement pour les petits échantillons, car il doit toucher l'ensemble du tableau ; mais me donne des répartitions assez régulières assez régulièrement :
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;
Avec trois exécutions, j'ai obtenu :
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
... qui a l'air un peu plus sain. YMMV bien sûr.
Cet article Oracle
couvre certaines techniques d'échantillonnage, et vous voudrez peut-être évaluer le ora_hash
approche également, et la version stratifiée si vos données se propagent et vos exigences de "représentativité" l'exigent.