Tomando prestada la tabla de ejemplo de jonearles, veo exactamente lo mismo (en 11gR2 en una imagen de desarrollador OEL), generalmente obtengo valores para a
fuertemente sesgado hacia 1
; con tamaños de muestra pequeños, a veces no puedo ver ninguno en absoluto. Con el paso adicional de aleatorización/restricción que mencioné en un comentario:
select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
... con tres carreras obtuve:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Sí, el 100 % realmente volvió como 1
en la segunda carrera. El sesgo en sí parece ser bastante aleatorio. Probé con el block
modificador que parecía hacer poca diferencia, quizás sorprendentemente, podría haber pensado que empeoraría en esta situación.
Es probable que esto sea más lento, ciertamente para tamaños de muestra pequeños, ya que tiene que afectar a toda la tabla; pero me da divisiones bastante uniformes de manera 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;
Con tres carreras obtuve:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
... que se ve un poco más saludable. YMMV por supuesto.
Este artículo de Oracle
cubre algunas técnicas de muestreo, y es posible que desee evaluar el ora_hash
enfoque también, y la versión estratificada si su difusión de datos y sus requisitos de 'representatividad' lo exigen.