为什么PostgreSQL JDBC预处理语句阈值默认为5?

Jap*_* D. 4 postgresql jdbc prepared-statement

默认情况下,参数语句treshold设置为5,而不是1.也就是说,

((PGStatement) my_statement).getPrepareThreshold()
Run Code Online (Sandbox Code Playgroud)

默认情况下始终返回5.

这是什么原因?为什么我不想在执行查询的前4次使用服务器端预处理语句?我无法理解为什么我会将其设置为另一个值而不是1,以及为什么默认设置为1.

你可以解释吗?非常感谢.

Sco*_*t A 5

服务器端预处理语句使用服务器端资源来存储语句的执行计划.阈值提供了一种启发式方法,可以"准备"实际使用的语句."经常"的定义默认为5.

请注意,服务器端预处理语句可能会导致执行计划不佳,因为它们不基于准备期间传递的参数.如果传递给预准备语句的参数对特定索引(例如)具有不同的选择性,则预准备语句的常规查询计划可能不是最理想的.作为另一个例子,如果您遇到查询执行远远大于创建解释计划的成本的情况,并且由于缺少绑定参数而没有正确设置解释计划,那么最好不要使用服务器端预备语句.

当驱动程序达到阈值时,它将按如下方式准备语句:

    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());
    }
Run Code Online (Sandbox Code Playgroud)

语句名称作为有线协议的一部分发送,它告诉Postgres准备服务器端.