Wenn ich mir die Beispieltabelle von jonearles ausleihe, sehe ich genau dasselbe (in 11gR2 auf einem OEL-Entwickler-Image), wobei ich normalerweise Werte für a
erhalte stark in Richtung 1
verzerrt; bei kleinen Stichprobenumfängen sehe ich manchmal gar keine. Mit dem zusätzlichen Randomisierungs-/Einschränkungsschritt, den ich in einem Kommentar erwähnt habe:
select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
... mit drei Läufen bekam ich:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Ja, 100 % kamen wirklich als 1
zurück im zweiten Lauf. Die Verzerrung selbst scheint eher zufällig zu sein. Ich habe es mit dem block
versucht Modifikator, der wenig Unterschied zu machen schien, vielleicht überraschend - ich hätte vielleicht gedacht, dass es in dieser Situation schlimmer werden würde.
Dies ist wahrscheinlich langsamer, sicherlich bei kleinen Stichprobengrößen, da es den gesamten Tisch treffen muss; aber gibt mir ziemlich gleichmäßige Splits ziemlich konsistent:
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;
Mit drei Läufen bekam ich:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
... was etwas gesünder aussieht. YMMV natürlich.
Dieser Oracle-Artikel
behandelt einige Sampling-Techniken, und Sie möchten vielleicht den ora_hash
auswerten Ansatz sowie die stratifizierte Version, wenn Ihre Daten sich ausbreiten und Ihre Anforderungen an die „Repräsentativität“ dies erfordern.