sql >> Base de Datos >  >> RDS >> Oracle

Muestreo aleatorio simple mientras extrae datos del almacén (motor de Oracle) usando proc sql en sas

Use el paquete DBMS_RANDOM para ordenar registros y luego use una cláusula de limitación de filas para restringir el tamaño de muestra deseado

La función dbms_random.value obtiene un número aleatorio entre 0 y 1 para todas las filas de la tabla y ordenamos en orden ascendente del valor aleatorio.

Así es como se produce el conjunto de muestra que identificó:

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

Para demostrar con la tabla de esquema de muestra, emp , muestreamos 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

Con el ejemplo anterior, observe que empno cambia significativamente durante la ejecución del comando SQL*Plus.

El rendimiento puede ser un problema con los recuentos de filas que está describiendo.

EDITAR:

Con tamaños de mesa del orden de 150 gigas - 79 MM, cualquier clasificación sería dolorosa.

Si la tabla tuviera una clave sustituta basada en una secuencia incrementada en 1, podríamos adoptar el enfoque de seleccionar cada enésimo registro en función de la clave.

p.ej.

    --scenario n = 3000

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

Este enfoque no usaría un índice (a menos que se cree un índice basado en funciones), pero al menos no estamos realizando una ordenación en un conjunto de datos de este tamaño.

Realicé un plan de explicación con una tabla que tiene cerca de 80 millones de registros y realiza un escaneo completo de la tabla (la condición obliga a esto sin un índice basado en funciones), pero esto parece sostenible.