sql >> Databáze >  >> RDS >> Oracle

jednoduché náhodné vzorkování při stahování dat ze skladu (orákul engine) pomocí proc sql v sas

Použijte balíček DBMS_RANDOM k seřazení záznamů a poté použijte klauzuli omezující řádky k omezení na požadovanou velikost vzorku

Funkce dbms_random.value získá náhodné číslo mezi 0 a 1 pro všechny řádky v tabulce a seřadíme je vzestupně podle náhodné hodnoty.

Zde je návod, jak vytvořit vzorovou sadu, kterou jste identifikovali:

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

Chcete-li demonstrovat s ukázkovou tabulkou schématu, emp , vzorujeme 4 záznamy:

   [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

U výše uvedeného příkladu si všimněte, že empno se výrazně změní během provádění příkazu SQL*Plus.

Výkon může být problém s počty řádků, které popisujete.

UPRAVIT:

S velikostí tabulek v řádu 150 giga – 79 MM by jakékoli třídění bylo bolestivé.

Pokud by tabulka měla náhradní klíč založený na sekvenci zvýšené o 1, mohli bychom zvolit přístup výběru každého n-tého záznamu na základě klíče.

např.

    --scenario n = 3000

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

Tento přístup by nepoužíval index (pokud není vytvořen index založený na funkcích), ale alespoň neprovádíme třídění na množině dat této velikosti.

Provedl jsem plán vysvětlení s tabulkou, která má téměř 80 milionů záznamů a provádí úplné prohledání tabulky (podmínka si to vynutí bez indexu založeného na funkcích), ale vypadá to udržitelně.



  1. java.net.InetAddress třída java nerozkládá IP na kontejneru Alpine Docker

  2. MYSQL JOIN na více tabulkách nevrací žádné výsledky

  3. Sail.js více připojení na začátku

  4. Jaký je rozdíl mezi CHAR a VARCHAR v SQL Server - SQL Server / T-SQL výukový program, část 31