PostgreSQLスキルアップノート(自己啓発のための個人サイト)
プリペアド文(PREPARE)
【一覧に戻る】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ プリペアド文(PREPARE)
■■■■
■■■■
■■■■ 2012/12/27
■■■■ 使用環境:PostgreSQL9.1.4 (CentOS6.2)
(C) 2012 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
★自己都合によりマニュアルへのリンクは9.2としています。ご了承下さい。
★このページはそのままカット&ペーストで実行して試すことができます。
【マニュアル】
PREPARE →●[マニュアル]
EXECUTE →●[マニュアル]
【参考記事】
【用語等】マニュアルでの日本語呼称
PREPARE =「プリペアド文(9.2〜)」=「準備された文」
9.2のPREPAREの解説ページ(上記ページ)では「プリペアド文」と記載するようになった。
が、他の箇所では追随できておらず、従来の呼称「準備された文」のままになっているケースが多い。
日本語はプリペアド文だが、文のつづりはPREPARE
■1■ プリペアド文(PREPARE)の概要
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1.概要
──────────────────────────────
・SQL実行時の解析負荷軽減を目的に、あらかじめ構文解析を完了させた文。
・実行時は解析はなく実行計画が作成されるのみ。※ただし補足参照
・PREPAREにより作成したプリペアド文はEXECUTEにより実行。
・有効範囲は現行のデータベースセッションの間のみ。
・関数的な用途にも使えるが、あくまでもセッション内に閉じた定義となる。
【補足】
ケースによっては実行計画の作成も事前に済ませてしまうこともある。たとえば、
・パラメータを持たないプリペアド文。
実行の値によって実行計画を変える必要がもともとないため。
・パラメータはあるが、性能に影響を受けないだろうとpostgreSQLが判断したとき。
上記状況はEXPLAINでパラメータが$nと表示されるか、値が埋め込まれているかでわかる。
構文解析 ・・・PREPARE時
実行計画作成 ・・・EXECUTE時・ケースによりPREPARE時
2.効果
──────────────────────────────
・実行時の解析の負荷が軽くなり性能に効果がある、
・マニュアルでは、繰り返し実行、かつ複雑な文ほど効果があるとされている。
単純な文の場合はそれほど効果が出ない可能性がある。
■2■ PREPAREの実機確認・その1
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【□】 テーブルを作成
drop table t1 cascade;
create table t1(c1 serial primary key,c2 text);
insert into t1 values
(default,'aaaaaaaa'),
(default,'aaaaxxxx'),
(default,'aaaayyyy'),
(default,'bbbbbbbb'),
(default,'cccccccc'),
(default,'dddddddd'),
(default,'eeeeeeee');
select * from t1 order by 1;
【□】 PREPAREによるプリペアド文作成
DEALLOCATE pre1;
PREPARE pre1 (int) AS
SELECT c1,c2 from t1 where c1 = $1
【補足】PREPAREの解除 「DEALLOCATE」
上の例 DEALLOCATE pre1 ではpre1を解除(削除)
すべてのPREPAREを解除する場合は DEALLOCATE all;
【□】 EXECUTEによる実行
execute pre1(1);
execute pre1(5);
c1 | c2
----+----------
1 | aaaaaaaa
c1 | c2
----+----------
5 | cccccccc
■3■ セッションで利用可能なプリペアド文の確認方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
pg_prepared_statementsシステムビューを使う。
【□】 select * from pg_prepared_statements;
name | statement | prepare_time | parameter_types | from_sql
------+------------------------------------+------------------------------+-----------------+----------
pre1 | PREPARE pre1 (int) AS +| 2012-12-28 10:58:59.18331+09 | {integer} | t
| SELECT c1,c2 from t1 where c1 = $1+| | |
| ; | | |
(1 row)
【参考】 \d+ pg_prepared_statements
View "pg_catalog.pg_prepared_statements"
Column | Type | Modifiers | Storage | Description
-----------------+--------------------------+-----------+----------+-------------
name | text | | extended |
statement | text | | extended |
prepare_time | timestamp with time zone | | plain |
parameter_types | regtype[] | | extended |
from_sql | boolean | | plain |
View definition:
SELECT p.name, p.statement, p.prepare_time, p.parameter_types, p.from_sql
FROM pg_prepared_statement() p(name, statement, prepare_time, parameter_types, from_sql);
以上