sql >> データベース >  >> RDS >> Oracle

数百万行のテーブルを使用して、Oracleでランダムな行をより速く選択する方法

    sample(x)の適切な値を使用する あなたができる最速の方法です。ブロック内ではブロックランダムと行ランダムなので、ランダムな行が1つだけ必要な場合:

    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
    

    サブパーティションテーブルを使用していますが、複数の行を取得してもかなりランダムになります:

    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
    

    おそらくSAMPLEを調整する必要があると思います フェッチするものに適切なサンプルサイズを使用する句。



    1. mySQLパーティショニングマルチファイルと1ファイルのパフォーマンス?

    2. php artisan mergethrowing[PDO例外]ドライバーが見つかりませんでした-Laravelを使用しています

    3. SQL自然結合

    4. タイプが数値、日付、または文字列である可能性のあるデータをmysqlに格納する方法