sql >> Databasteknik >  >> RDS >> Oracle

enkelt slumpmässigt urval samtidigt som data hämtas från lager (oracle-motor) med proc sql i sas

Använd paketet DBMS_RANDOM för att sortera poster och använd sedan en radbegränsande klausul för att begränsa till önskad provstorlek

Funktionen dbms_random.value får ett slumptal mellan 0 och 1 för alla rader i tabellen och vi sorterar i stigande ordning efter det slumpmässiga värdet.

Så här producerar du provuppsättningen du identifierade:

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

För att demonstrera med exempelschematabellen, emp , vi samplar 4 poster:

   [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

Med exemplet ovan, lägg märke till att empno ändras avsevärt under körningen av kommandot SQL*Plus.

Prestandan kan vara ett problem med antalet rader som du beskriver.

EDIT:

Med bordsstorlekar i storleksordningen 150 spelningar - 79 MM skulle all sortering vara smärtsam.

Om tabellen hade en surrogatnyckel baserad på en sekvens ökad med 1, skulle vi kunna välja var n:e post baserat på nyckeln.

t.ex.

    --scenario n = 3000

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

Detta tillvägagångssätt skulle inte använda ett index (om inte ett funktionsbaserat index skapas), men vi utför åtminstone inte en sortering på en datamängd av denna storlek.

Jag utförde en förklaringsplan med en tabell som har nära 80 miljoner poster och den utför en fullständig tabellskanning (villkoret tvingar fram detta utan ett funktionsbaserat index) men det ser hållbart ut.



  1. Enkelriktad synkronisering i realtid från sql-server till ett annat datalager

  2. Någon som någonsin använt PayPals webbplatsbetalningsstandard med SESSION-variabler?

  3. PHP - Exportera MySQL-tabeller till JSON-fil

  4. MySQL maximal minnesanvändning