カスタム検索

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はありますので同じような流れでチューニング可能です。

2009年10月6日火曜日

Air Flex visible=false で領域を確保しないように

良く忘れるのでメモ

通常Air,Flexではlayoutを指定した状態(verticalとかhorizontalとか)で、配置されたオブジェクトのvisibleをfalseにしても、表示が消えるだけで詰めてはくれません。

詰める場合は includeInLayout というアトリビュートを false にしてやればOKです。

2009年10月1日木曜日

WinとMacでコマンドの実行時間を測定する

忘れそうなのでメモしておく、ただし標準で使えるコマンドで

・Mac

time コマンドを使ってその後のコマンドにかかった時間を教えてくれる

time copy /tmp/hoge.zip .

real 0m0.028s
user 0m0.001s
sys 0m0.019s

複数コマンドのトータル結果を知り合い場合は、コマンドを並べたシェルスクリプトを time で実行してやれば良い

test.sh
time copy /tmp/hoge.zip .
time copy /tmp/foo.zip .

time sh test.sh

シェルスクリプトの中のコマンドも全部time書いておけば、一個づつにかかった時間と、最後にトータルの時間がわかる


・Windows

以下のようなbatを作って実行すると、開始時間と終了時間がわかるので引き算するとかかった時間がわかる

echo %time%
copy c:¥tmp¥hoge.zip .
copy c:¥tmp¥foo.zip .
echo %time%