Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So beschleunigen Sie die Auswahl zufälliger Zeilen in Oracle mit einer Tabelle mit Millionen von Zeilen

Verwendung geeigneter Werte von sample(x) ist der schnellste Weg, den Sie können. Es ist block-zufällig und zeilen-zufällig innerhalb von Blöcken, also wenn Sie nur eine zufällige Zeile wollen:

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

Ich verwende eine unterpartitionierte Tabelle und erhalte eine ziemlich gute Zufälligkeit, selbst wenn ich mehrere Zeilen ergreife:

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

Ich vermute, Sie sollten wahrscheinlich Ihr SAMPLE tunen -Klausel, um eine angemessene Stichprobengröße für das zu verwenden, was Sie abrufen.