Tomando emprestado a tabela de exemplo de jonearles, vejo exatamente a mesma coisa (em 11gR2 em uma imagem de desenvolvedor OEL), geralmente obtendo valores para
a
fortemente inclinado para 1
; com tamanhos de amostra pequenos, às vezes não consigo ver nenhum. Com a etapa extra de randomização/restrição que mencionei em um comentário:select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
... com três corridas eu consegui:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Sim, 100% realmente voltou como
1
na segunda corrida. A inclinação em si parece ser bastante aleatória. Eu tentei com o block
modificador que parecia fazer pouca diferença, talvez surpreendentemente - eu poderia ter pensado que ficaria pior nesta situação. Isso provavelmente será mais lento, certamente para tamanhos de amostra pequenos, pois deve atingir a mesa inteira; mas me dá divisões bastante uniformes de forma bastante consistente:
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;
Com três corridas eu consegui:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
... que parece um pouco mais saudável. YMMV é claro.
Este artigo da Oracle abrange algumas técnicas de amostragem, e você pode querer avaliar o
ora_hash
abordagem também, e a versão estratificada se seus dados se espalharem e seus requisitos de 'representatividade' exigirem.