作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
参数语句treshold默认设置为5,而不是1。即
((PGStatement) my_statement).getPrepareThreshold()
默认情况下总是返回 5。
那会是什么原因呢?为什么我不想在执行查询的前 4 次使用服务器端准备语句?我不明白为什么我会将其设置为 1 以外的另一个值,以及为什么默认情况下不将其设置为 1。
你能解释一下吗?非常感谢。
最佳答案
服务器端准备好的语句消耗服务器端资源来存储语句的执行计划。阈值提供了一种启发式方法,可以使准备好实际“经常”使用的语句。 “经常”的定义默认为 5。
请注意,服务器端准备好的语句可能会导致执行计划不佳,因为它们不是基于准备期间传递的参数。如果传递给准备语句的参数对特定索引具有不同的选择性(例如),则准备语句的一般查询计划可能不是最优的。再举一个例子,如果您遇到查询的执行比创建解释计划的成本大得多的情况,并且由于缺少绑定(bind)参数而没有正确设置解释计划,您最好不要使用服务器端准备好的语句。
当驱动程序达到阈值时,它将准备如下语句:
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());
}
语句名称作为有线协议(protocol)的一部分发送,它告诉 Postgres 在服务器端准备它。
关于postgresql - 为什么 PostgreSQL JDBC 准备语句阈值默认为 5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8104595/
我是一名优秀的程序员,十分优秀!