Oracle
 sql >> Baza danych >  >> RDS >> Oracle

proste losowe próbkowanie podczas pobierania danych z hurtowni (silnik Oracle) za pomocą proc sql w sas

Użyj pakietu DBMS_RANDOM do sortowania rekordów, a następnie użyj klauzuli ograniczającej wiersze, aby ograniczyć do żądanego rozmiaru próbki

Funkcja dbms_random.value pobiera losową liczbę od 0 do 1 dla wszystkich wierszy w tabeli i sortujemy w kolejności rosnącej losowej wartości.

Oto jak wyprodukować zidentyfikowany zestaw próbek:

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

Aby zademonstrować z przykładową tabelą schematu, emp , próbkujemy 4 rekordy:

   [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

W powyższym przykładzie zauważ, że empno zmienia się znacząco podczas wykonywania polecenia SQL*Plus.

Wydajność może być problemem z liczbą wierszy, które opisujesz.

EDYTUJ:

Przy rozmiarach stołów rzędu 150 g - 79 MM każde sortowanie byłoby bolesne.

Gdyby tabela miała klucz zastępczy oparty na sekwencji zwiększonej o 1, moglibyśmy wybrać co n-ty rekord na podstawie klucza.

np.

    --scenario n = 3000

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

To podejście nie wykorzystuje indeksu (chyba że zostanie utworzony indeks oparty na funkcji), ale przynajmniej nie wykonujemy sortowania na zbiorze danych o takim rozmiarze.

Przeprowadziłem plan wyjaśniania z tabelą, która ma blisko 80 milionów rekordów i wykonuje pełne skanowanie tabeli (warunek wymusza to bez indeksu opartego na funkcjach), ale wygląda to na możliwe do utrzymania.



  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 Query:Jak porównać dwie kolumny w różnych tabelach o wartościach oddzielonych przecinkami?

  2. Dlaczego otrzymuję ten wyjątek SQLSyntaxErrorException:ORA-00933:Polecenie SQL nie zostało poprawnie zakończone, gdy próbuję wykonać to zapytanie JDBC?

  3. Jak formatować liczby ujemne za pomocą nawiasów kątowych w Oracle

  4. Obracanie danych za pomocą dwóch kolumn

  5. Regex bazy danych Oracle dla powtarzających się grup znaków