OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

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$