如果我想对两个不同的请求执行相同的查询,并且我使用带有Doctrine2的预准备语句...预备语句是否仅在第一次发送并由数据库存储一段时间?或者在每个脚本完成后删除它?
答案 0 :(得分:2)
在PostgreSQL上,预准备语句仅在会话结束时有效,并且未保存在内存中并在多个会话之间共享,请参阅doc: http://www.postgresql.org/docs/9.2/static/sql-prepare.html
预准备语句仅持续当前数据库的持续时间 会话。会话结束时,忘记准备好的声明, 所以必须在重新使用之前重新创建它。这也意味着 单个预准备语句不能同时使用多个 数据库客户;但是,每个客户都可以创建自己的准备 声明使用。
但是,他们也说,PostgreSQL可能(但不需要)在内存中保存这个查询的计划,以便将来重用:
如果准备好的语句执行的次数足够多,服务器可以 最终决定保存并重复使用通用计划而不是 每次重新规划。如果准备好,这将立即发生 声明没有参数;否则只有通用时才会发生 计划似乎并不比依赖计划的计划贵得多 具体参数值。通常,将选择通用计划 只有当查询的性能估计相当不敏感时 到提供的具体参数值。
要检查PostgreSQL用于准备语句的查询计划,请使用EXPLAIN。如果正在使用通用计划,它将包含 参数符号$ n,而自定义计划将具有当前实际值 参数值代入其中。