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.