はじめに
仕事で普段からDBを使っていますが、クエリの実行速度を決める要因はなんなんだろう?と気になったので書籍を使って勉強してみました。
勉強してわかった、パフォーマンスに関係している要素を整理します。
結論
- DBのパフォーマンスにはソフトウェアの面とハードウェアの面両方が関わっている
- ソフトウェアではクエリ評価エンジンを使って適切な実行計画を作成できるかどうかが関係している
- ハードウェアではいかに効率よくメモリを使えるかが関係している
ソフトウェアの影響
ソフトウェア面では、DBMSに存在するクエリ評価エンジンとそれが作成する実行計画がパフォーマンスに大きく影響しています。
実行計画
実行計画はどのようにデータにアクセスするかという計画を指します。
実行計画は人間でも読めるような形で表現され、これを元にパフォーマンスのチューニングを行うことが可能です。
例えばMySQLであれば以下のようにすると実行計画を確認することができます。
EXPLAIN SELECT * FROM hoges
※実行計画の読み方についてはまだ勉強中なので、まとまったらまた記事にします。
クエリ評価エンジン
クエリ評価エンジンは、ユーザーが送信したSQLを解析し、最適なデータの取得方法を決定するDBMSのモジュールです。
データの取得方法は複数作成され、最終的に最もコストが低い方法が採用されます。
この採用された取得方法が実行計画となります。
クエリ評価エンジンの内部はさらに様々なサブモジュールが存在しています。
ここではサブモジュールの一つであるオプティマイザとカタログマネージャについて記載します。
オプティマイザ
オプティマイザは先ほど述べた実行計画を作成するためのサブモジュールです。
カタログマネージャから統計情報を取得し、それを元に複数の実行計画が作成されます。
カタログマネージャ
カタログマネージャにはオプティマイザが参考にするための統計情報が保存されています。
統計情報とはインデックスやテーブルに関するメタ情報です。
この統計情報はテーブルの情報が更新されるたびに情報が古くなってしまうため、更新が必要です。
DBMSによってはデフォルトで更新処理後に統計情報が書き換わるものもあります。
ハードウェアがDBパフォーマンスに与える影響
ハードウェアの影響として、メモリとストレージの関係があります
メモリとストレージには、それぞれトレードオフがあり、以下のような違いがあります。
読み込み・書き込み速度 | コスト | 容量 | 永続性 | |
---|---|---|---|---|
メモリ | 速い | 高い | 小さい | ない |
ストレージ | 遅い | 小さい | 大きい | ある |
メモリの役割
前述のようにメモリは高コストな代わりに高速に書き込みと読み込みが行えます。
そのため、メモリにはデータキャッシュやログバッファ、ワーキングメモリなどの領域を確保して実行速度を上げています。
データキャッシュ
データキャッシュは名前の通り、DBに存在するデータをキャッシュしている領域です。
ここにデータが存在すればストレージを検索することなくデータを返すことができるため検索のスピードが上がります。
ログバッファ
ログバッファはデータの更新処理の際に使用します。
更新処理の際に、一旦ログバッファに更新情報を溜めてから非同期で更新することによってユーザへのレスポンスを速くしています。
ワーキングメモリ
ワーキングメモリはSQLの実行時にソートやハッシュなどの実際の処理を行う際に使用するメモリ領域です。
この領域はパフォーマンスにおいて重要な役割をしていて、ワーキングメモリの容量が不足すると一旦ストレージのTEMP領域という領域を使って処理を続行します。
その結果、ストレージとのデータの出し入れが起きている状態になり、処理に時間がかかってしまいます。
まとめ
今回はDBのパフォーマンスに関連している要素を俯瞰して整理してみました。
今後は実行計画の読み方や、具体的なパフォーマンスの改善方法などを深掘りしてみたいと思います。
少しでも参考になれば幸いです!
参考