Oracle
 sql >> Base de données >  >> RDS >> Oracle

échantillonnage aléatoire simple lors de l'extraction des données de l'entrepôt (moteur oracle) à l'aide de proc sql dans sas

Utilisez le package DBMS_RANDOM pour trier les enregistrements, puis utilisez une clause de limitation de lignes pour limiter la taille d'échantillon souhaitée

La fonction dbms_random.value obtient un nombre aléatoire entre 0 et 1 pour toutes les lignes de la table et nous trions par ordre croissant de la valeur aléatoire.

Voici comment produire le jeu d'échantillons que vous avez identifié :

    SELECT
    *
FROM
    (
        SELECT
            *
        FROM
            tbl1
        ORDER BY dbms_random.value
    )
FETCH FIRST 1000000 ROWS ONLY;

Pour démontrer avec l'exemple de table de schéma, emp , nous échantillonnons 4 enregistrements :

   [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

Avec l'exemple ci-dessus, notez que le empno change de manière significative lors de l'exécution de la commande SQL*Plus.

Les performances peuvent être un problème avec le nombre de lignes que vous décrivez.

MODIF :

Avec des tailles de table de l'ordre de 150 concerts - 79 MM, tout tri serait pénible.

Si la table avait une clé de substitution basée sur une séquence incrémentée de 1, nous pourrions adopter l'approche consistant à sélectionner chaque nième enregistrement en fonction de la clé.

par exemple.

    --scenario n = 3000

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

Cette approche n'utiliserait pas d'index (à moins qu'un index basé sur une fonction ne soit créé), mais au moins nous n'effectuons pas de tri sur un ensemble de données de cette taille.

J'ai exécuté un plan d'explication avec une table contenant près de 80 millions d'enregistrements et il effectue une analyse complète de la table (la condition l'oblige sans index basé sur une fonction), mais cela semble tenable.