sql >> データベース >  >> RDS >> PostgreSQL

Gosql-プリペアドステートメントスコープ

    プリペアドステートメントは、たとえばパラメータ値のみが異なる可能性のある反復SQLコマンドを実行できるようにするためのものです。

    プリペアドステートメントはアクティブなデータベース接続を予約する可能性があるため(「ロング」は使用されない場合を意味します。プリペアドステートメントを何度も繰り返し実行することはまったく問題ありません)、これらは「長く」存続することを意図していません。これに時間がかかる場合でも、回数)。接続は高価なリソースであり、必要な期間だけ保持する必要があります。プリペアドステートメントの束を作成し、それらを閉じないだけで、アクティブな/許可された接続が不足し、データベースサーバーへのそれ以上の通信をブロックする可能性があります。

    同じinsertを実行する場合は、プリペアドステートメントを使用します 、update またはselect 1つの(HTTP)リクエストで複数回異なるパラメータを持つステートメント。プリペアドステートメントを使用して(HTTP)リクエストを存続させないでください。

    特定のドライバーの実装とデータベースサーバーでは、プリペアドステートメントにDBサーバー自体に割り当てられたリソースが含まれる場合があります(Goアプリケーションではありません)。たとえば、プリペアドステートメントがDBサーバーでプリコンパイルされ、サーバーがクエリ実行プランを準備し、メモリなどの特定のリソースを割り当てる場合があります。これらは、準備されたステートメントが閉じられるまで永続的に予約される場合があります。

    プリペアドステートメント<の実装の詳細について説明している記事(Myles McDonnellが以下のコメントに投稿)があります。 / a> 囲碁で。プリペアドステートメントがトランザクションから作成されていない場合、接続を接続プールに解放しますが、必要に応じて、プリペアドステートメントが準備されたものと同じものを再利用しようとします(データベースサーバーがアクティブな役割を果たしている場合)プリペアドステートメントでは、サーバー側の接続にバインドされています)。そうでない場合は、再準備します。 新しい接続でそれらを実行します(望ましくないパフォーマンスオーバーヘッドを引き起こします)。

    全体として、あなたが説明するのは作業モデルであり、後続の多くの要求で必要/実行される準備済みステートメントの数が少ない場合、応答時間が短くなる可能性があります。しかし、一方で、長期的には、準備されたすべてのステートメントがプールのすべての接続で準備される可能性があることも意味します。これがあなたのケースで受け入れられるかどうかを決定します。

    一般に、これは回避する必要があります(そして、準備されたステートメントはHTTPリクエストの終了前に閉じられます)が、それらの数が少なく、次々と続く多くのリクエストでそれらが必要な場合は、リクエストスコープ外に移動できます。 。




    1. gem pgを使用してRubyスクリプトからPostgres(pg)データベースに接続できません(これはレールではなく、純粋なルビーです)

    2. DBCAデータベースの作成が正しくありませんREMOTE_LISTENER

    3. 2つの異なるデータベースのテーブル間で結合しますか?

    4. レコードが見つからない場合はゼロを返します