8

Oracle で数年間働いた後、PostgreSQL に引っ越しました。PostgreSQL データベースを使用するアプリケーション (Java、JDBC) のプリペアド ステートメントに関するパフォーマンスの問題を調査しています。

Oracle は、準備済みステートメントを SGA にキャッシュします。準備済みステートメントのプールは、データベース接続間で共有されます。

PostgreSQL のドキュメントはこれを示していないようです。ドキュメントのスニペットは次のとおりです(https://www.postgresql.org/docs/current/static/sql-prepare.html)-

プリペアド ステートメントは、現在のデータベース セッションの間だけ存続します。セッションが終了すると、準備されたステートメントは忘れられるため、再度使用する前に再作成する必要があります。これは、1 つのプリペアド ステートメントを同時に複数のデータベース クライアントで使用できないことも意味します。ただし、各クライアントは、使用する独自の準備済みステートメントを作成できます。

データベースが一般的に実行される準備済みステートメントのある種の共通プールを実装することは非常に基本的なように思われるため、これを正しく理解していることを確認したいだけです。

PostgreSQL がこれらをキャッシュしない場合、多くのデータベース トランザクションを予期するすべてのアプリケーションが、接続間で再利用できる何らかの準備済みステートメント プールを開発する必要があることを意味します。

以前に PostgreSQL を使用したことがある場合は、これについての洞察をいただければ幸いです。

4

1 に答える 1

8

はい、あなたの理解は正しいです。通常、非常に重要な一連の準備済みクエリがある場合は、アプリケーションでカスタム関数を呼び出して、それらを接続時に設定します。

これには 3 つの主な理由があります。

  1. 長いToDoリストがあり、開発者が興味を持っている/お金を払って取り組んでいるときに、それらは完了します。おそらく、資金を提供する価値があると考えた人や、効率的な方法を思いついた人はまだいないでしょう。

  2. PostgreSQL は、Oracle よりもはるかに広い範囲の環境で実行されます。インストールされているシステムの 99% は、これによるメリットはあまりないと思います。高いトランザクション パフォーマンスを必要としないセットアップが非常に多くあります。さらに言えば、DBA が必要かどうかに気付かなければなりません。

  3. 計画されたクエリが常に成功するとは限りません。実際のデータとクエリ パラメータに可能な限り適合するように、キャッシュの計画/無効化を遅らせるためにかなりの作業が行われました。

このようなものを追加するのに最適な場所は、接続プール (pgbouncer/pgpool) の 1 つにあると思いますが、前回確認したときは、そのような機能はありませんでした。

HTH

于 2012-07-26T18:18:57.773 に答える