カスタム検索

2009年10月15日木曜日

Grails+postgresでDBチューニング

Grails+postgresでのチューニングで自分がやっている方法をざっくりとまとめ

・postgresからスロークエリの検出をする

postgresql.conf に設定

log_min_duration_statement = 5000ms

上記だと5秒以上かかった処理をログに書き出してくれます。
Hibernateから実行したクエリは以下のような感じで書き出されます。

LOG: duration: 7912.798 ms statement: EXECUTE [PREPARE: select book0_.id as book_1_ from BOOK book0_ where book0_.id=$1]

・クエリのコストを検出する

ログに出力されたクエリが実際に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 件のコメント: