カスタム検索

2009年4月9日木曜日

クエリチューニングについて本気出して考えてみた

Grailsでアプリを作っていると、O/Rマッピングに頼りっぱなしで、重い所だけたまにHQLを書いていたのだが、
さすがにDBの規模が大きくなるとそうも言ってられないよなーと思い、クエリチューニングに乗り出す事にした。
(indexの最適な付け方も良くわからないし :D )

まずは現在のボトルネックを探す。
今までは体感とシステム上で時間を計測してたけど、DBの事はDBに聞けって事でログ解析をする事に。
ここらへんを参考にした)

postgresのログ解析には pgfouine と pqa というのがあるらしい、前者は php、後者は ruby だ。
これはもちろん pgfouine だろう! php も ruby もよく知らないけど groovy 好きっ子としては ruby に行ったら負けかなと思っている。

ITProの記事を参考に、postgres のログを出力する設定をする

んで pgfouine を実行・・・!しようと思ったら動かない。GDというライブラリが必要らしい。
Macにデフォで入っている php にはこれが組み込まれていない。調べてみると MacPorts でインストールすると簡単らしい。
ということで MacPorts から php をインストール、、、長い、、、長い、、、しかもCPUフルに使いやがる、そういう事は先に言ってくれと。

無事インストールが終わった所で pgfouine を起動してみる。

php pgfouine.php -logtype stderr -file log/postgresql-xxxx-xx-xx_xxxxxx.log -format html-with-graphs -report vanfu_sql.html=overall,hourly,bytype,slowest,n-mosttime,n-mostfrequent,n-slowestaverage,n-mostfrequenterrors,tsung


とりあえず出力オプション全部付けてみた :p



おー、なんかかっこいいですね!
ちょっと試しで3分ほど適当にシステムを稼働させて集計した結果、SELECT件数が 4,179、、、うーんO/Rマッピングが遅いと言われるのがわかります。
まあ逆に考えれば1クエリ0.01秒の改善でも3分あたり40秒もの改善になるって事ですね。

とりあえず現状の確認方法まで
次回はGrails向けのチューニング方法をまとめようと思います。

0 件のコメント: