Jap*_* D. 4 postgresql jdbc prepared-statement
默认情况下,参数语句treshold设置为5,而不是1.也就是说,
((PGStatement) my_statement).getPrepareThreshold()
Run Code Online (Sandbox Code Playgroud)
默认情况下始终返回5.
这是什么原因?为什么我不想在执行查询的前4次使用服务器端预处理语句?我无法理解为什么我会将其设置为另一个值而不是1,以及为什么默认设置为1.
你可以解释吗?非常感谢.
服务器端预处理语句使用服务器端资源来存储语句的执行计划.阈值提供了一种启发式方法,可以"准备"实际使用的语句."经常"的定义默认为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准备服务器端.