sql >> Databasteknik >  >> RDS >> Oracle

hur man gör det snabbare att välja slumpmässiga rader i Oracle med en tabell med miljontals rader

Använder lämpliga värden för sample(x) är det snabbaste sättet du kan. Det är blockslumpmässigt och radslumpmässigt inom block, så om du bara vill ha en slumpmässig rad:

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

Jag använder en underpartitionerad tabell, och jag får ganska bra slumpmässighet även när jag tar tag i flera rader:

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

Jag misstänker att du förmodligen borde ställa in din SAMPLE klausul för att använda en lämplig provstorlek för det du hämtar.



  1. Kopiera värden från en kolumn till en annan i samma tabell

  2. SQL Data Control Language

  3. Oracle JDBC-prestanda för ResultSet

  4. MySQL benchmark