2017-04-07 13 views
1

準備されたステートメントが各セッションで管理されるのはなぜですか?準備されたステートメントが各セッションで管理されるのはなぜですか?

すべてのデータベースがセッションごとにプリペアドステートメントを処理するかどうかはわかりません。 postgresqlとmysql(多分)はそうします。

なぜセッション間で共有されないのですか?何か理由はありますか?

たとえば、 接続プールには多数の接続があり、接続は同じクエリを共有し、同じ準備済みの文も生成します。なぜデータベースはコネクションが準備されたステートメントを共有できないのですか?

+0

ステートメントは接続上で準備され、各接続は1つのセッションに関連付けられているため、 –

+0

「各接続は1つのセッションに関連付けられています」という意味は? –

+0

それ以外はどうやって管理すべきですか?なぜ彼らは共有されるのだろうか?どのようにそれらを共有しますか?あなたは意義を認識していますか?あなたは何を得ますか?質問の逆の答えがわからない場合は、質問をすることはできません。 – Mjh

答えて

2

共有キャッシュを維持するのはコストがかかります。競合状態からキャッシュを保護する必要があります。キャッシュをクリーンアップする必要があります。これが最初の引数です。 2番目の引数はより重要です。準備された文はキャッシュされた実行計画ですが、この計画は1つのパラメータベクトルに最適化されています。あなたが別のパラメータのベクトルを使用している場合、計画はこのベクトルを再び最適化することができません。哲学があるので、どんなユーザーでも異なるベクトルを使用して、異なる計画を必要とすることがあります。セッション共有プラン・キャッシュを使用しても、計画の生成によるオーバーヘッドは排除されません(ただし、この単純な問合せは、単純な問合せでは最小限に抑えられますが、共有データの管理に関するオーバーヘッドおよび競合条件が排除されます)。

関連する問題