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

jak zrychlit výběr náhodných řádků v oracle s tabulkou s miliony řádků

Použití vhodných hodnot sample(x) je nejrychlejší způsob, jak můžete. Je blokově náhodný a řádek náhodný v blocích, takže pokud chcete pouze jeden náhodný řádek:

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

Používám tabulku s dílčími oddíly a dostávám docela dobrou náhodnost i při zachycení více řádků:

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

Domnívám se, že byste pravděpodobně měli vyladit svůj SAMPLE klauzule k použití vhodné velikosti vzorku pro to, co načítáte.



  1. Vložení hodnoty NOW() do datového typu datetime vrací 0000-00-00 00:00:00

  2. Problémy s výkonem hromadného vkládání PostgreSQL/JooQ při načítání z CSV; jak mohu zlepšit proces?

  3. Hekaton se zvratem:TVP v paměti – část 3

  4. Dočasně deaktivujte všechna omezení cizího klíče