Заимствайки примерната таблица на jonearles, виждам точно същото нещо (в 11gR2 на изображение на OEL разработчик), обикновено получавайки стойности за a
силно изкривена към 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
на второто бягане. Самото изкривяване изглежда доста случайно. Опитах с block
модификатор, който изглежда нямаше значение, може би изненадващо - може би си мислех, че ще се влоши в тази ситуация.
Това вероятно ще бъде по-бавно, със сигурност за малки размери на извадката, тъй като трябва да достигне цялата таблица; но ми дава доста равномерни разделяния доста последователно:
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 разбира се.
Тази статия на Oracle
обхваща някои техники за вземане на проби и може да искате да оцените ora_hash
подход, както и стратифицираната версия, ако разпространението на вашите данни и изискванията ви за „представителност“ го изискват.