[pgsql-jp: 26291] Re: Status情報解析方法について
okayasuk @ nttdata.co.jp
okayasuk @ nttdata.co.jp
2002年 6月 5日 (水) 21:17:25 JST
岡安です。
杉田さん、早速のご回答ありがごうございます。
いくつか補足します。
まず以下のような前提があります。
0) DBサーバのCPU使用率を下げたい
1) JDBC経由で実行したSQLの処理時間を調べたい
2) Statement よりも PreparedStatementを使ったほうが
同一のSQL(かつパラメータのみ異なる場合)を複数回
実行した場合、2回目以降のSQLの解析時間がなくなる
だろうと期待。
3) 2)が本当かどうか確認したい。
例えばOracleのライブラリキャッシュ(SQLのキャッシュ)
のような機能がPostgreSQLにもあることを期待しています。
Oracleであればこのキャッシュヒット率でCPU使用率が
かなり変わるので、PostgreSQLでも同様なのかと想像
していました。
(予想でなくてちゃんと調べろというのはごもっともですが)
ということでI/Oはあまり気にしていません。
また、SQL自体のチューニングはまだ実施していません。
> ;;; SQLの動作情報(処理時間の詳細)を取得したい。
Parser, Rewriter, Planner, Executor 等の処理時間を調べて
上記2)を確認しようと試みました。
> 〓timing の方がよいと考えています。
この方法は知りませんでした、参考になります。
explain analyze より正確な結果が得られるわけですね。
> 以下のコードで表示されている内容が上記に該当しています。
>
> src/backend/tcop/postgres.c の ShowUsage() での getrusage()
> src/backend/storage/buffer/bufmgr.c の ShowBufferUsage()
〓timing と同じ情報が getrusage() で取得できると嬉しいかなと
期待しながら、上記ソースをこれから確認してみます。
悩んでみても始まらないので、StatementとPreparedStatementの
それぞれで同じSQLを実行した場合の処理時間を比較してみました。
結果はどちらも、全くと言っていいほど同じ処理時間でした。
参考までに、使用したコードを載せます。
// ------ Statement での処理-----
ResultSet rs = null;
ResultSetMetaData md = null;
Statement stmt = con.createStatement();
//ここでSQLつくってます
String[] sql = new String[SQL_LOOP];
for (int i=0;i<SQL_LOOP;i++){
sql[i] = "SELECT a, b "
+ " FROM table_a "
+ " WHERE a > " + i
+ " LIMIT 10";
}
//計測開始
start = System.currentTimeMillis();
for (int i=0;i<SQL_LOOP;i++){
stmt.executeQuery(sql[i]);
}
//計測終了
end = System.currentTimeMillis();
// ------ ここまで-----
// ----PreparedStatement での処理-----
PreparedStatement stmt2 = null;
ResultSet rs2 = null;
String sql2 =
" SELECT a, b "
+ " FROM table_a "
+ " WHERE a > ? "
+ " LIMIT 10 ";
stmt2 = con.prepareStatement(sql2);
//計測開始
start = System.currentTimeMillis();
for (int i=0;i<SQL_LOOP;i++){
stmt2.setInt(1, i);
rs2 = stmt2.executeQuery();
}
//計測終了
end = System.currentTimeMillis();
// ------ ここまで-----
----------------------------------------
株式会社 NTTデータ ビジネス開発事業本部
基盤システム事業部 第二ソリューション技術担当
岡安 一将
mailto:okayasuk @ nttdata.co.jp
Tel: 03-5541-9580
Fax: 03-5541-9590
pgsql-jp メーリングリストの案内