Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Einfache Zufallsstichprobe beim Abrufen von Daten aus dem Warehouse (Oracle Engine) mit proc sql in sas

Verwenden Sie das DBMS_RANDOM-Paket, um Datensätze zu sortieren, und verwenden Sie dann eine Zeilenbegrenzungsklausel, um sie auf die gewünschte Stichprobengröße zu beschränken

Die Funktion dbms_random.value erhält eine Zufallszahl zwischen 0 und 1 für alle Zeilen in der Tabelle und wir sortieren in aufsteigender Reihenfolge des Zufallswerts.

So erstellen Sie den von Ihnen identifizierten Mustersatz:

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

Zur Veranschaulichung mit der Beispielschematabelle emp , proben wir 4 Datensätze:

   [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

Beachten Sie beim obigen Beispiel, dass empno während der Ausführung des SQL*Plus-Befehls erheblich ändert.

Die Leistung könnte ein Problem mit der von Ihnen beschriebenen Zeilenanzahl sein.

BEARBEITEN:

Bei Tabellengrößen in der Größenordnung von 150 GB - 79 MM wäre jede Sortierung mühsam.

Wenn die Tabelle einen Ersatzschlüssel basierend auf einer um 1 inkrementierten Sequenz hätte, könnten wir den Ansatz wählen, jeden n-ten Datensatz basierend auf dem Schlüssel auszuwählen.

z.B.

    --scenario n = 3000

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

Dieser Ansatz würde keinen Index verwenden (es sei denn, es wird ein funktionsbasierter Index erstellt), aber zumindest führen wir keine Sortierung bei einem Datensatz dieser Größe durch.

Ich habe einen EXPLAIN-Plan mit einer Tabelle durchgeführt, die fast 80 Millionen Datensätze enthält und einen vollständigen Tabellenscan durchführt (die Bedingung erzwingt dies ohne einen funktionsbasierten Index), aber das sieht haltbar aus.