PostgreSQL 9.6.1で実行計画の確認
カテゴリ:OSSセットアップ | ソフトウェア:PostgreSQL | タグ:
最終更新日:2021/01/01 | 公開日:2016/12/28
目次
概要
PostgreSQLでSQLを実行した際に、実行に時間がかかるのでチューニングによって処理時間を短縮したい、 といったときに行う対処の一つとして実行計画のチューニングがあります。 まずはその第一歩として、実行計画を確認し、必要に応じて統計情報を更新するという手順を紹介します。
構成
サーバ構成
OSバージョン
CentOS 7.2.1511 x86_64
ソフトウェア・パッケージ一覧
- postgresql96-9.6.1-1PGDG.rhel7.x86_64.rpm
- postgresql96-libs-9.6.1-1PGDG.rhel7.x86_64.rpm
- postgresql96-server-9.6.1-1PGDG.rhel7.x86_64.rpm
手順
実行計画の確認と統計情報の更新
データベースへ接続
PostgreSQLサーバの addressbook データベースに user01 ユーザで接続します。 接続後、 mst_user テーブルのデータを表示して内容を確認します。 簡単に準備したテーブルなので1行しかデータを入れていません。
-bash-4.2$ psql -U user01 addressbook
ユーザ user01 のパスワード: ←user01のパスワードを入力
psql (9.6.1)
"help" でヘルプを表示します.
addressbook=> select * from mst_user;
id | name | address | phone | create_date | delete_date | last_update
----+------+---------+--------------+----------------------------+-------------+----------------------------
1 | Taro | Tokyo | 03-1234-5678 | 2016-12-27 00:29:44.239193 | | 2016-12-27 00:29:44.239193
(1 行)
addressbook=>
実行計画の表示(SQLは実行しない)
SQL文の前に explain を付加すると、統計情報を元に作成された実行計画が表示されます。 この場合、実行計画の表示のみで、SQLは実行されません。
addressbook=> explain select * from mst_user; QUERY PLAN ------------------------------------------------------------- Seq Scan on mst_user (cost=0.00..13.10 rows=310 width=228) (1 行) addressbook=>
実行計画と実行結果の表示
SQL文の前に explain analyze を付加すると、統計情報を元に作成された実行計画が表示され、 更に実際にSQLを実行した結果が表示されます。
以下の実行例では統計情報から取得した情報からは mst_user テーブルの推定行は310行だったにも関わらず、 実際には1行しかなかったことが rows の値から分かります。
addressbook=> explain analyze select * from mst_user; QUERY PLAN ------------------------------------------------------------------------------------------------------- Seq Scan on mst_user (cost=0.00..13.10 rows=310 width=228) (actual time=0.038..0.043 rows=1 loops=1) Planning time: 0.186 ms Execution time: 0.178 ms (3 行) addressbook=>
ANALYZEによる統計情報の収集
上記のように推定行と実際の行が乖離している場合は、ANALYZEを実行し統計情報を更新します。 ただ、通常は自動バキュームによりANALYZEも自動的に実行されるため、手動でANALYZEが必要となるケースは少ないかもしれません。
addressbook=> analyze mst_user; ANALYZE
ANALYZE実行後の実行計画確認
再度 explain analyze を付加したSQLを実行すると、今回は実行計画での推定行と実際の行が同じになりました。
addressbook=> explain analyze select * from mst_user; QUERY PLAN --------------------------------------------------------------------------------------------------- Seq Scan on mst_user (cost=0.00..1.01 rows=1 width=52) (actual time=0.025..0.028 rows=1 loops=1) Planning time: 0.913 ms Execution time: 0.109 ms (3 行) addressbook=> \q -bash-4.2$