prepare されたステートメント#

psycopg は自動的なシステムを使用して prepare されたステートメント を管理します。クエリが prepare されると、クエリのパースと計画はサーバーのセッションに保存されます。これにより、以降の同じコネクション上の同じクエリ実行が (異なるパラメータでも) 最適化されます。

コネクション上で prepare_threshold より長い時間実行された場合、クエリは自動的に prepare されます。psycopgprepared_max より多くのステートメントが計画されないことを保証します。追加のクエリが実行された場合、最も最近使われなかった (LRU) ものが割り当てから外され、関連するリソースが開放されます。

ステートメントの prepare は、以下のような複数の方法でコントロールされます。

  • クエリを prepare することは、prepare=TrueConnection.execute() または Cursor.execute() に渡すことで直ちに決定できます。すでに prepare されていなければ、そのクエリは prepare され、1回目の使用から prepare されたものとして実行されます。

  • 逆に、prepare=Falseexecute() に渡すと、実行時間の長さに関わらず、クエリが prepare されるのを回避できます。パラメータのデフォルトは None です。その場合、上記の条件が満たされると prepare されます。

  • コネクションの prepare_threshold 属性を None に設定すると、そのコネクション上の prepare されたステートメントの使用を無効化できます。

バージョン 3.1 で変更: prepare_thresholdconnect() のキーワード引数としても設定できます。

参考

PostgreSQL ドキュメンテーションの PREPARE には、PostgreSQL 内での prepare されたステートメントに関するさまざまな詳細が説明されています。

ただし、psycopg は PREPAREEXECUTE などの SQL ステートメントではなく、PQsendPrepare によって公開された PQsendQueryPrepared などのプロトコルレベルのコマンドを使用することに注意してください。

警告

PgBouncer などの外部のコネクション プールの使用は、prepare されたステートメントとは互換性がありません。同一のクライアント コネクションが、参照しているサーバー セッションを変更する可能性があるためです。そのようなミドルウェアが使用されている場合、prepare されたステートメントは Connection.prepare_threshold 属性を None に設定することで無効化する必要があります。