Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Amostragem do Oracle, precisa do número exato de resultados (cláusula de amostra)


Tomando emprestado a tabela de exemplo de jonearles, vejo exatamente a mesma coisa (em 11gR2 em uma imagem de desenvolvedor OEL), geralmente obtendo valores para a fortemente inclinado para 1; com tamanhos de amostra pequenos, às vezes não consigo ver nenhum. Com a etapa extra de randomização/restrição que mencionei em um comentário:
select a, count(*) from (
    select * from test1 sample (1)
    order by dbms_random.value
)
where rownum < 101
group by a;

... com três corridas eu consegui:
         A   COUNT(*)
---------- ----------
         1         71
         2         29

         A   COUNT(*)
---------- ----------
         1        100

         A   COUNT(*)
---------- ----------
         1         64
         2         36

Sim, 100% realmente voltou como 1 na segunda corrida. A inclinação em si parece ser bastante aleatória. Eu tentei com o block modificador que parecia fazer pouca diferença, talvez surpreendentemente - eu poderia ter pensado que ficaria pior nesta situação.

Isso provavelmente será mais lento, certamente para tamanhos de amostra pequenos, pois deve atingir a mesa inteira; mas me dá divisões bastante uniformes de forma 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;

Com três corridas eu consegui:
         A   COUNT(*)
---------- ----------
         1         48
         2         52

         A   COUNT(*)
---------- ----------
         1         57
         2         43

         A   COUNT(*)
---------- ----------
         1         49
         2         51

... que parece um pouco mais saudável. YMMV é claro.

Este artigo da Oracle abrange algumas técnicas de amostragem, e você pode querer avaliar o ora_hash abordagem também, e a versão estratificada se seus dados se espalharem e seus requisitos de 'representatividade' exigirem.