・postgresからスロークエリの検出をする
postgresql.conf に設定
log_min_duration_statement = 5000ms
上記だと5秒以上かかった処理をログに書き出してくれます。
Hibernateから実行したクエリは以下のような感じで書き出されます。
LOG: duration: 7912.798 ms statement: EXECUTE
・クエリのコストを検出する
ログに出力されたクエリが実際にDBで検索にかかるコストを算出します。
SQLの部分( select ~)の前に explain をつけて実際にクエリを実行します。
($1,$2等は実際の値に置き換えて下さい。)
explain select book0_.id as book_1_ from BOOK book0_ where book0_.id=1
すると以下のような情報が帰ってきます。
Seq Scan on book this_ (cost=0.00..32955.18 rows=1 width=2104)
Filter: (id = 1)
0~32955のコストが予想されています。
・indexによるチューニングを行う
10000を超えるようなコストはかなりの負荷になりますので、indexをつけてやります。
(実際にはidにindexは必要ありません、検索対象となる名称とかに置き換えて下さい)
CREATE INDEX id_idx
ON book
USING btree
(id);
再度 explain 付きのクエリを実行すると、以下のような結果が帰ってきます。
Bitmap Heap Scan on book this_ (cost=4.64..98.43 rows=1 width=2104)
Recheck Cond: (id = 1)
-> Bitmap Index Scan on id_idx (cost=0.00..4.64 rows=1 width=0)
Index Cond: (id = 1)
検索対象のフィールドにIndexがついていたため、indexを使って検索し、総コストが 4.64~98.43 となります。
これであればサクサクと検索が実行されます :)
postgresを対象に書きましたが、MySQLでもOracleでもexplainはありますので同じような流れでチューニング可能です。
0 件のコメント:
コメントを投稿