DBMSを今よりももっと正しく扱うために、DBMSで使用されるメモリについて学習したことのまとめ
バッファマネージャとは
どのようなデータをどの程度の期間、バッファに載せておくかといったことを管理する機能。
HDD上のデータにアクセスするよりもメモリ(バッファ/キャッシュ)にアクセスする方が高速
である。データベースのパフォーマンスにおいて重要な役割を担う。
バッファ/キャッシュとは
パフォーマンスの向上を目的として、データを保持するメモリのこと。
バッファ
はユーザとストレージとの間に割って入ることでSQL文のディスクアクセスを減らす。
キャッシュ
もユーザとストレージの中間に位置することで、データの転送遅延を緩和する。
メモリ上の2つのバッファ
データキャッシュ
ディスクにあるデータの一部を保持するためのメモリ領域
。SELECT文でデータキャッシュの中のデータを取得できた場合は、非常に高速なレスポンスが期待できる。
ログバッファ
更新処理(INSERT, UPDATE, DELETE, MERGE)の実行に関係する。
DBMSは更新SQL文を受け取った際、即座にストレージ上のデータを変更はせず、一度ログバッファ上に更新情報をためて、ディスクへの更新はあとでまとめて行う(commit時)
。
メモリの欠点
メモリの欠点として、揮発性(データの永続性がない)
が挙げられる。
DBMSが何らかの障害でプロセスダウンした場合にメモリ内の全てのデータが消失してしまう
ため、機能的に完全にディスクの代替ができるわけではない。
データキャッシュはあくまでもキャッシュなので、消失してもオリジナルのデータは存在しているが、ログバッファの消失の際は、データ不整合の問題が発生する
。
耐障害性・データ整合性とパフォーマンス
これを回避するため、コミットのタイミングで更新情報をログファイルに書き込むことで、データ整合性を担保している。その際、ディスクへの同期アクセスが必要になるため、遅延が発生する可能性がある。
ディスクへの同期処理をすればデータ整合性と耐障害性は高まるが、パフォーマンスは低くなる。逆に、パフォーマンスを追求すると、データ整合性と耐障害性は低くなる(トレードオフの関係)
。
検索と更新のどちらを優先すべきか
メモリの限られたリソースを最大限有効活用するためには、検索と更新のどちらを優先すべきか
というトレードオフに直面する。
システムが検索に比べて更新処理の多い特性を持っているならば(バッチ処理など)、ログバッファにメモリを多く割り当てるといったチューニング(最適化)が必要になる。
ワーキングメモリ
ソートやハッシュなど特定の処理に利用される作業用の領域として、ワーキングメモリ
がある。
ソートはORDER BY句、集合演算、ウインドウ関数など、ハッシュは主にテーブル同士の結合でハッシュ結合が使用された場合に実行される。メモリ領域の名称や管理方法はDBMSによって異なる(MySQLではソートバッファ)。
このメモリ領域は必要なときにのみ使用され、使用後は開放される一時的な領域であり、不足した場合はストレージを使用する(パフォーマンス悪化につながる、通称TEMP落ち)ため、性能的に重要
である。
参考
参考図書 : SQL実践入門