Oracle
 sql >> Database >  >> RDS >> Oracle

come rendere più veloce la selezione di righe casuali in Oracle con una tabella con milioni di righe

Usando i valori appropriati di sample(x) è il modo più veloce che puoi. È un blocco casuale e una riga casuale all'interno dei blocchi, quindi se vuoi solo una riga casuale:

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

Sto usando una tabella suddivisa in partizioni e sto ottenendo una casualità abbastanza buona anche afferrando più righe:

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

Sospetto che dovresti probabilmente ottimizzare il tuo SAMPLE clausola per utilizzare una dimensione del campione appropriata per ciò che stai recuperando.