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

jak przyspieszyć wybieranie losowych wierszy w Oracle dzięki tabeli z milionami wierszy

Używanie odpowiednich wartości sample(x) to najszybszy sposób. Jest losowy blok i losowy wiersz w blokach, więc jeśli chcesz tylko jeden losowy wiersz:

select dbms_rowid.rowid_relative_fno(rowid) as fileno,
       dbms_rowid.rowid_block_number(rowid) as blockno,
       dbms_rowid.rowid_row_number(rowid) as offset
  from (select rowid from [my_big_table] sample (.01))
 where rownum = 1

Używam tabeli podzielonej na partycje i uzyskuję całkiem dobrą losowość, nawet pobierając wiele wierszy:

select dbms_rowid.rowid_relative_fno(rowid) as fileno,
       dbms_rowid.rowid_block_number(rowid) as blockno,
       dbms_rowid.rowid_row_number(rowid) as offset
  from (select rowid from [my_big_table] sample (.01))
 where rownum <= 5

    FILENO    BLOCKNO     OFFSET
---------- ---------- ----------
       152    2454936         11
       152    2463140         32
       152    2335208          2
       152    2429207         23
       152    2746125         28

Podejrzewam, że prawdopodobnie powinieneś dostroić swój SAMPLE klauzulę, aby użyć odpowiedniej wielkości próbki do tego, co pobierasz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Podłączanie Excel VBA do Oracle DB za pomocą „ODBC”

  2. Oracle hierarchiczna klauzula startowa kwerendy od join

  3. Problem z odejmowaniem daty w Oracle

  4. SqlDeveloper:wyczyść listę aliasów sieciowych

  5. Przekazywanie tablicy danych jako parametru wejściowego do procedury Oracle