カスタムプランと汎用プラン
@fujii_masao
PREPARE
●
PREPARE文を使うことで、SQLの構文解析結果やプランをPostgreSQLサー
バにキャッシュできる
●
以降、そのキャッシュを利用することで、構文解析やプラン生成の処理をス
キップでき、性能改善できる
-- PREPARE文でSELECTの構文解析結果やプランを登録
-- $1はバインド変数で、実際の値はEXECUTE時に指定
PREPARE hoge AS SELECT * FROM test WHERE i = $1;
-- バインド変数$1に1を指定して、PREPARE結果を利用してSQL実行
EXECUTE hoge(1);
カスタムプランと汎用プラン
カスタムプラン (custom plan)
●
バインド変数の実際の値を考慮して生成されるプラン
●
SELECT * FROM test WHERE i = 1に対してプラン生成されるイメージ
●
PREPAREでプランをキャッシュできない
●
EXECUTE時に指定されたバインド変数の値を考慮して、毎回プランが生成さ
れる
汎用プラン (generic plan)
●
バインド変数の実際の値を考慮せずに生成されるプラン
●
SELECT * FROM test WHERE i = $1で$1の値が不明なままプランが生成され
るイメージ
●
PREPAREでプランをキャッシュできる
●
バインド変数が不明なまま生成したプランなので、EXECUTE時に指定される
値によっては最適でないプランである可能性がある
PREPAREとプラン選択
①PREPARE実行後、最初の5回のEXECUTE実行では、カスタムプランが必ず
選択される
➔
つまり、PREPAREでプランをキャッシュしたと思っても、最初5回のSQL実
行では毎回プランは生成される
②6回目以降のEXECUTE実行では、「それまでに実行されたカスタムプランの
平均コスト」と「汎用プランのコスト」が比較され、小さい方のプランが選
択される
●
もし汎用プランが選択された場合は、それ以降ずっと汎用プランが選択され
る
➔
つまり、この時点からプランはキャッシュされる
③カスタムプランが選択された場合は、それ以降のEXECUTE実行でも②のコス
ト比較とプラン選択が行われる
➔
つまり、汎用プランが選択されるまではカスタムプランが選択され続け、プ
ランはキャッシュされない
バインド変数がない場合
●
バインド変数がないSQLをPREPAREした場合は、最初のEXECUTEから常に
汎用プランが選択されて、プランはキャッシュされる
PREPARE hoge2 AS SELECT * FROM i = 9;
デモ
●
テーブル作成
CREATE TABLE test (i int, j int);
CREATE INDEX test_idx ON test(i);
-- i=1のレコードを1万件格納
INSERT INTO test VALUES (1, generate_series(1, 10000));
-- i=2〜10のレコードを1件ずつ格納
INSERT INTO test VALUES (generate_series(2, 10), 0);
VACUUM ANALYZE test;
デモ
● PREPARE
PREPARE hoge AS SELECT * FROM test WHERE i = $1;
●
EXECUTEを5回実行
EXPLAIN ANALYZE EXECUTE hoge(1);
EXPLAIN ANALYZE EXECUTE hoge(1);
EXPLAIN ANALYZE EXECUTE hoge(1);
EXPLAIN ANALYZE EXECUTE hoge(1);
EXPLAIN ANALYZE EXECUTE hoge(1);
QUERY PLAN
--------------------------------------------------------------------------------------------------------
Seq Scan on test (cost=0.00..170.11 rows=10000 width=8) (actual time=0.020..2.639
rows=10000 loops=1)
Filter: (i = 1)
Rows Removed by Filter: 9
Planning time: 0.171 ms
Execution time: 3.298 ms
(5 rows)
デモ
●
6回目以降のEXECUTE
EXPLAIN ANALYZE EXECUTE hoge(1);
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
-
Index Scan using test_idx on test (cost=0.29..41.80 rows=1001 width=8) (actual
time=0.083..10.003 rows=10000 loops=1)
Index Cond: (i = $1)
Planning time: 0.222 ms
Execution time: 11.131 ms
(4 rows)
PREPAREと統計情報の更新
●
統計情報が更新されると、キャッシュしていた汎用プランが適切でなくなる
可能性があるので、キャッシュはクリアされて、再度カスタムプランと汎用
プランのコスト比較とプラン選択が行われる
➔
②に戻る
デモ
● i=1のレコードを5万件追加してVACUUM ANALYZE
INSERT INTO test VALUES (1, generate_series(1, 50000));
VACUUM ANALYZE test;
● EXECUTE
EXPLAIN ANALYZE EXECUTE hoge(1);
➔
最初はSeqScanのカスタムプランだけど、
いずれIndexScanの汎用プランが選択される。
注意
●
一度でもコストが大きい汎用プランが生成されてしまうと、
統計情報が更新されて以前の汎用プランが破棄されても、
そのコストがリセットされずに残ってしまって、
その汎用プランのコストとカスタムプランのコストが比較され、
常にカスタムプランが選択されてしまう問題がある
●
キャッシュされている汎用プランが破棄されるときに、
そのコストがPostgreSQL内部で残ってしまうのが
バグかどうかは不明。いずれコミュニティに報告したい

More Related Content

PDF
あなたの知らないPostgreSQL監視の世界
PPTX
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
まずやっとくPostgreSQLチューニング
PDF
Vacuum徹底解説
PPTX
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PDF
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
あなたの知らないPostgreSQL監視の世界
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
まずやっとくPostgreSQLチューニング
Vacuum徹底解説
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)

What's hot (20)

PDF
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
PDF
Inside vacuum - 第一回PostgreSQLプレ勉強会
PDF
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLの運用・監視にまつわるエトセトラ
PDF
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
PPTX
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PDF
PostgreSQL: XID周回問題に潜む別の問題
PPTX
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PDF
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PDF
使ってみませんか?pg_hint_plan
PPTX
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PPTX
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
PDF
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
PDF
Hadoopのシステム設計・運用のポイント
PDF
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
Inside vacuum - 第一回PostgreSQLプレ勉強会
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(PostgreSQL Conference Japa...
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQL: XID周回問題に潜む別の問題
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
使ってみませんか?pg_hint_plan
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQL開発コミュニティに参加しよう!(PostgreSQL Conference Japan 2021 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Hadoopのシステム設計・運用のポイント
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
Ad

Similar to カスタムプランと汎用プラン (20)

PDF
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -
PDF
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
PDF
PostgreSQL 12の話
PPTX
Powershell勉強会 v3 (もっと新しいバージョンがあります)
PPTX
Powershell勉強会 v2 (もっと新しいバージョンがあります)
PPTX
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
PDF
[db tech showcase Tokyo 2016] A32: Oracle脳で考えるSQL Server運用 by 株式会社インサイトテクノロジー...
PPTX
Powershell勉強会 v5 (こちらが最新です。)
PDF
とあるDBAの黒い画面(ターミナル)
PPTX
SQLチューニング入門 入門編
PDF
PHPUnit でテスト駆動開発を始めよう
PDF
Pg14_sql_standard_function_body
PDF
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
PPTX
Powershell勉強会 v4 (もっと新しいバージョンがあります。)
PDF
今年はJava進化の年!今知っておくべき新しいJava
PDF
C11,12 SQL Server 2012 Performance Tuning by Yukio Kumazawa
PPTX
T sql 振り返り
PDF
Intro2 Sqlanalyzer
PDF
PostgreSQL10徹底解説
PDF
Fluentd casual
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
PostgreSQL 12の話
Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v2 (もっと新しいバージョンがあります)
Powershell 超絶基礎 勉強会 v1 (もっと新しいバージョンがあります)
[db tech showcase Tokyo 2016] A32: Oracle脳で考えるSQL Server運用 by 株式会社インサイトテクノロジー...
Powershell勉強会 v5 (こちらが最新です。)
とあるDBAの黒い画面(ターミナル)
SQLチューニング入門 入門編
PHPUnit でテスト駆動開発を始めよう
Pg14_sql_standard_function_body
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
Powershell勉強会 v4 (もっと新しいバージョンがあります。)
今年はJava進化の年!今知っておくべき新しいJava
C11,12 SQL Server 2012 Performance Tuning by Yukio Kumazawa
T sql 振り返り
Intro2 Sqlanalyzer
PostgreSQL10徹底解説
Fluentd casual
Ad

More from Masao Fujii (12)

PDF
Introduction to pg_cheat_funcs
PDF
PostgreSQL Quiz
PDF
誰か私のTODOを解決してください
PDF
WAL圧縮
PDF
PostgreSQL replication
PDF
使ってみませんか?pg hint_plan
PDF
PostgreSQLレプリケーション徹底紹介
PDF
PostgreSQL V9 レプリケーション解説
PDF
PostgreSQL9.0アップデート レプリケーションがやってきた!
PDF
Streaming Replication (Keynote @ PostgreSQL Conference 2009 Japan)
PDF
Built-in Replication in PostgreSQL
PDF
PostgreSQL9.1同期レプリケーションとPacemakerによる高可用クラスタ化の紹介
Introduction to pg_cheat_funcs
PostgreSQL Quiz
誰か私のTODOを解決してください
WAL圧縮
PostgreSQL replication
使ってみませんか?pg hint_plan
PostgreSQLレプリケーション徹底紹介
PostgreSQL V9 レプリケーション解説
PostgreSQL9.0アップデート レプリケーションがやってきた!
Streaming Replication (Keynote @ PostgreSQL Conference 2009 Japan)
Built-in Replication in PostgreSQL
PostgreSQL9.1同期レプリケーションとPacemakerによる高可用クラスタ化の紹介

カスタムプランと汎用プラン