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

PostgreSQL JDBCプリペアドステートメントのしきい値がデフォルトで5になっているのはなぜですか?

    サーバー側のプリペアドステートメントは、サーバー側のリソースを消費して、ステートメントの実行プランを格納します。しきい値は、実際に「頻繁に」使用されるステートメントを準備するヒューリスティックを提供します。 「多くの場合」の定義はデフォルトで5です。

    サーバー側のプリペアドステートメントは、プリペアド中に渡されたパラメーターに基づいていないため、実行プランが不十分になる可能性があることに注意してください。プリペアドステートメントに渡されるパラメータが特定のインデックスに対して異なる選択性を持っている場合(たとえば)、プリペアドステートメントの一般的なクエリプランは最適ではない可能性があります。別の例として、クエリの実行がExplainプランの作成コストよりもはるかに大きく、バインドパラメータがないためにExplainプランが適切に設定されていない場合は、使用しない方がよい場合があります。サーバー側のプリペアドステートメント。

    ドライバーがしきい値に達すると、次のようにステートメントを準備します。

        if (!oneShot)
        {
            // Generate a statement name to use.
            statementName = "S_" + (nextUniqueID++);
    
            // And prepare the new statement.
            // NB: Must clone the OID array, as it's a direct reference to
            // the SimpleParameterList's internal array that might be modified
            // under us.
            query.setStatementName(statementName);
            query.setStatementTypes((int[])typeOIDs.clone());
        }
    

    ステートメント名はワイヤープロトコルの一部として送信され、Postgresにサーバー側で準備するように指示します。



    1. C#経由でMySQLサーバーに接続する

    2. ORA-04068:パッケージの既存の状態は破棄されましたORA-04065:ストアド・プロシージャが実行、変更、または削除されていません

    3. XMLをSQLServerに挿入するときにエンコードエラーを切り替えることができない問題を解決する方法

    4. Mysqlテーブルのcronジョブを切り捨てますか?