Meminjam tabel contoh jonearles, saya melihat hal yang persis sama (dalam 11gR2 pada gambar pengembang OEL), biasanya mendapatkan nilai untuk a
sangat condong ke arah 1
; dengan ukuran sampel yang kecil kadang-kadang saya tidak dapat melihat sama sekali. Dengan langkah pengacakan/pembatasan ekstra yang saya sebutkan dalam komentar:
select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
... dengan tiga kali saya mendapatkan:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Ya, 100% benar-benar kembali sebagai 1
pada putaran kedua. Kemiringan itu sendiri tampaknya agak acak. Saya mencoba dengan block
pengubah yang tampaknya membuat sedikit perbedaan, mungkin mengejutkan - saya mungkin berpikir itu akan menjadi lebih buruk dalam situasi ini.
Ini kemungkinan akan lebih lambat, tentu saja untuk ukuran sampel kecil, karena harus mengenai seluruh tabel; tetapi memberi saya cukup genap cukup konsisten:
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;
Dengan tiga putaran saya mendapatkan:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
... yang terlihat sedikit lebih sehat. YMMV tentunya.
Artikel Oracle ini
mencakup beberapa teknik pengambilan sampel, dan Anda mungkin ingin mengevaluasi ora_hash
pendekatan juga, dan versi bertingkat jika data Anda menyebar dan persyaratan Anda untuk 'keterwakilan' menuntutnya.