Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment accélérer la sélection de lignes aléatoires dans oracle avec une table avec des millions de lignes

Utilisation des valeurs appropriées de sample(x) est le moyen le plus rapide possible. C'est bloc-aléatoire et ligne-aléatoire dans les blocs, donc si vous ne voulez qu'une seule ligne aléatoire :

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

J'utilise une table sous-partitionnée et j'obtiens un assez bon caractère aléatoire, même en saisissant plusieurs lignes :

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

Je soupçonne que vous devriez probablement régler votre SAMPLE clause pour utiliser une taille d'échantillon appropriée pour ce que vous récupérez.