ページの先頭行へ戻る
HA Database Ready 業務開発ガイド(Open SQL編)
FUJITSU Integrated System

5.1.2 対処方法

特定のアプリケーションやSQL文が遅い場合は、以下の原因が考えられます。

これらの原因に対する解析方法および対処方法について説明します。


5.1.2.1 アプリケーションの解析

アプリケーションに問題があるかどうかを確認するには、アプリケーションのログを利用します。出力したログを解析し、アプリケーションから意図したとおりにSQL文が実行されているか、データベースサーバから返却された結果は正しいかを観点に確認します。

アプリケーションのログについては、“4.3 アプリケーションのログ”を参照してください。


5.1.2.2 SQL文の解析

SQL文の解析方法について、説明します。

EXPLAIN文による実行計画の取得

SQL文に問題があるかどうかを確認するために、実行計画を確認し判断します。

実行計画は、EXPLAIN文を用いることで取得できます。

psqlコマンドでの実行例
postgres=# EXPLAIN SELECT * FROM tbl1 WHERE id = 1;
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on tbl1  (cost=0.00..2431.50 rows=59 width=184)
   Filter: (id = 1)
(2 rows)

上記の例では、表(tbl1)のシーケンシャルスキャン(Seq Scan)を行っています。

このような場合、条件式に指定している列に対してインデックスを作成することで、レスポンスを改善できる可能性があります。

psqlコマンドでの実行例
postgres=# CREATE INDEX tbl1_id_index ON tbl1 (id);

インデックスを利用した検索を行っている場合は、以下に示す結果となります。

psqlコマンドでの実行例
postgres=# EXPLAIN SELECT * FROM tbl1 WHERE id = 1;
                                 QUERY PLAN
-----------------------------------------------------------------------------
 Bitmap Heap Scan on tbl1  (cost=4.71..205.25 rows=59 width=184)
   Recheck Cond: (id = 1)
   ->  Bitmap Index Scan on tbl1_id_index  (cost=0.00..4.70 rows=59 width=0)
         Index Cond: (id = 1)
(4 rows)

インデックス(tbl1_id_index)を使ったインデックス検索(Bitmap Index Scan)を行っていることが確認できます。

ポイント

EXPLAIN ANALYZEを実行すると、実行計画を出力すると共に、各計画ノードの実行時間(ミリ秒単位)と、実際に返される行数が表示に追加されますので、SQLの処理でどこに問題があるかを特定するのに有効です。

Open SQLのログに出力された実行計画の取得

実行に1秒以上かかったSQL文の実行計画はログに出力されています。Open SQLのログは、システムビューのpgx_logから参照可能です。実行計画は、列'message'に出力されており、メッセージ番号を示す'14412:'で始まります。

psqlコマンドでの実行例
postgres=# SELECT log_time, message FROM pgx_log WHERE message LIKE '14412:%';
       log_time           |               message
--------------------------+------------------------------------------------------
・・・・
2012-09-20 20:13:12.452 JS|14412: duration: 1.441 s  plan:                        +
                         |Query Text: SELECT * from tbl1 where id = 1;              +
                         |Seq Scan on tbl1  (cost=0.00..5609.38 rows=312 width=10)  +
                         |  Filter: (id = 1)
・・・・