データベース・メモリ・バッファ


メモリバッファ



データベースにSQLリクエストを送信すると、DBMSはディスクにアクセスして対応するデータを取得します.ディスクにアクセスすると、データI/Oはディスクブロック単位です.ただし、ディスクI/Oはメモリ計算よりも長い時間(通常、ディスク計算速度が数千倍遅い)を要するため、メモリバッファを使用してディスクI/O結果を管理する方法でディスクI/Oの回数を最小限に抑えることができます.ディスク・アクセスとメモリ・バッファの管理の主体は次のとおりです.
  • バッファマネージャ:ブロック単位でI/Oを記録するため、メモリ内のバッファを管理するプログラムが必要です.
  • ファイルマネージャ:レコードがファイルに格納されているため、ディスク上のファイルを管理するプログラムが必要です.
  • メモリバッファの利点は、必要なデータがメインメモリのDBMSバッファ内にある場合、ディスクI/O操作を実行する必要がないことです.DBMSは、ディスクにアクセスするのではなく、バッファ内のレコードデータを最初に使用します.必要なレコードがない場合は、ディスクにアクセスしてブロックを取得し、バッファに保存します.現在のDBMSで使用されているページはpin状態になり、使用終了後にunpin状態になります.
    ただし、メモリバッファ領域はディスク領域よりも小さく、限られているため、バッファ内のページを管理することが重要です.バッファ領域がいっぱいの場合は、エクスポートするページをバッファから選択する必要がありますが、ページを削除することはできません.unpin状態で、次のアルゴリズムを使用して削除するページを選択します.

    LRU


    「最近のレコード使用」(LRU)は、バッファから最も早く最後に使用したページをエクスポートするアルゴリズムです.直感的な観点から見ると、これは良いアルゴリズムのように見えますが、実際にはデータベースではあまりよくないかもしれません.SQLのjoin演算を実行するとき、よく考えてみると、最近アクセスしたレコードよりもアクセスのレコードが早いことがわかります.
    # Python pseudo code
    join_result = []
    for record1 in table1:
      for record2 in table2:
        if record1.column1 == record2.column2:
          join_result.append([*record1, *record2])

    table1および表table2において、表table1column1および表table2column2に対してjoin演算が実行される場合、上述した重複する繰り返し文が実行される.このとき、table1のrecord 6およびtable2のrecord d 1にアクセスし、次に(青色実線)table1のrecord 6およびtable2のrecord 2(青色破線)にアクセスします.ここで、record 2は私たちが最後にアクセスした最も古い記録であり、recordnは最近アクセスした記録です.
    データベース・バッファは、通常、nが最近アクセスされたが、最も遅いアクセスが予想され、レコード2が最も早いアクセスであるが、アクセス速度が最も速いため、最近使用されたページを置き換えるポリシーを使用する.

    Toss immediate


    特定のブロック内のレコードをすべて処理した後、直ちにメモリバッファからブロックを削除するアルゴリズム.

    MRU


    LRUとは対照的に、最近使用されたアルゴリズムは、最近完了した演算のブロックをバッファから破棄するアルゴリズムである.
    バッファからエクスポートするページを選択し、ディスク上のブロックと同じ内容のページを選択した場合は、そのページを削除します.異なる場合は、ページ内容がディスクブロックに反映されます.通常、各ページは、dirtyタグなどのページが変更されたかどうかを個別に管理します.