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

amostragem aleatória simples ao extrair dados do warehouse (motor oracle) usando proc sql no sas


Use o pacote DBMS_RANDOM para classificar registros e, em seguida, use uma cláusula de limitação de linha para restringir ao tamanho de amostra desejado

A função dbms_random.value obtém um número aleatório entre 0 e 1 para todas as linhas da tabela e classificamos em ordem crescente do valor aleatório.

Veja como produzir o conjunto de amostras que você identificou:
    SELECT
    *
FROM
    (
        SELECT
            *
        FROM
            tbl1
        ORDER BY dbms_random.value
    )
FETCH FIRST 1000000 ROWS ONLY;

Para demonstrar com a tabela de esquema de amostra, emp , amostramos 4 registros:
   [email protected]> SELECT
  2      empno,
  3      rnd_val
  4  FROM
  5      (
  6          SELECT
  7              empno,
  8              dbms_random.value rnd_val
  9          FROM
 10              emp
 11          ORDER BY rnd_val
 12      )
 13  FETCH FIRST 4 ROWS ONLY;
EMPNO  RND_VAL
7698   0.06857749035643605682648168347885993709
7934   0.07529612360785920635181751566833986766
7902   0.13618520865865754766175030040204331697
7654   0.14056380246495282237607922497308953768


[email protected]> SELECT
  2      empno,
  3      rnd_val
  4  FROM
  5      (
  6          SELECT
  7              empno,
  8              dbms_random.value rnd_val
  9          FROM
 10              emp
 11          ORDER BY rnd_val
 12      )
 13  FETCH FIRST 4 ROWS ONLY;
EMPNO  RND_VAL
7839   0.00430658806761508024693197916281775492
7499   0.02188116061148367312927392115186317884
7782   0.10606515700372416131060633064729870016
7788   0.27865276349549877512032787966777990909

Com o exemplo acima, observe que o empno muda significativamente durante a execução do comando SQL*Plus.

O desempenho pode ser um problema com as contagens de linhas que você está descrevendo.

EDITAR:

Com tamanhos de mesa na ordem de 150 shows - 79 MM, qualquer classificação seria dolorosa.

Se a tabela tivesse uma chave substituta baseada em uma sequência incrementada em 1, poderíamos adotar a abordagem de selecionar cada enésimo registro com base na chave.

por exemplo.
    --scenario n = 3000

 FROM
    tbl1
WHERE
    mod(table_id, 3000) = 0;

Essa abordagem não usaria um índice (a menos que um índice baseado em função seja criado), mas pelo menos não estamos executando uma classificação em um conjunto de dados desse tamanho.

Eu executei um plano de explicação com uma tabela que tem cerca de 80 milhões de registros e ela executa uma verificação completa da tabela (a condição força isso sem um índice baseado em função), mas isso parece sustentável.