借用jonearles的示例表,我看到完全相同的东西(在OEL开发人员图像上的11gR2中),通常得到严重偏向1的值;样本量很小我有时根本看不到.我在评论中提到了额外的随机化/限制步骤:
select a,count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
……我得到了三次跑步:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
是的,100%真的在第二轮比赛中回归1.倾斜本身似乎相当随机.我尝试使用块修饰符似乎没有什么区别,也许令人惊讶 – 我可能认为在这种情况下它会变得更糟.
对于小样本来说,这可能会更慢,因为它必须达到整个表格;但确实给我提供了相当一致的分裂:
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;
通过三次运行我得到了:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
……看起来更健康一点. YMMV当然.
This Oracle article涵盖了一些抽样技术,您可能也想评估ora_hash方法,如果您的数据传播以及您对“代表性”的要求需要分层版本.