Oracle
 sql >> база данни >  >> RDS >> Oracle

просто произволно вземане на проби при изтегляне на данни от склад (oracle engine) с помощта на proc sql в sas

Използвайте пакета DBMS_RANDOM за сортиране на записи и след това използвайте клауза за ограничаване на редове, за да ограничите до желания размер на извадката

Функцията dbms_random.value получава произволно число между 0 и 1 за всички редове в таблицата и ние сортираме във възходящ ред на произволната стойност.

Ето как да създадете примерния набор, който идентифицирахте:

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

За да демонстрирате с примерната таблица със схеми, emp , вземаме проби от 4 записа:

   [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

С горния пример забележете, че empno се променя значително по време на изпълнението на командата SQL*Plus.

Производителността може да е проблем с броя на редовете, които описвате.

РЕДАКТИРАНЕ:

С размери на таблицата от порядъка на 150 гигабайта - 79 MM всяко сортиране би било болезнено.

Ако таблицата имаше сурогатен ключ, базиран на последователност, увеличена с 1, бихме могли да приемем подхода на избиране на всеки n-ти запис въз основа на ключа.

напр.

    --scenario n = 3000

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

Този подход няма да използва индекс (освен ако не е създаден базиран на функция индекс), но поне не извършваме сортиране на набор от данни с такъв размер.

Изпълних план за обяснение с таблица, която има близо 80 милиона записа и тя извършва пълно сканиране на таблица (условието налага това без базиран на функция индекс), но това изглежда приемливо.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Автоматично преименуване на таблицата на дяловете в ORACLE

  2. Oracle извлича ли всички редове, преди да оцени rownum?

  3. Данни от таблица(и) на Oracle за оператори INSERT с JAVA

  4. PostgreSQL 9.5 - декодиране/избор на случай за разрешаване на грешка с utf8 не работи

  5. Разделете IPv4 адреса на 4 числа в Oracle sql