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);

                                                                                                                               
以上 
inserted by FC2 system