首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgres在服务器上做语句缓存吗?

Postgres在服务器上做语句缓存吗?
EN

Stack Overflow用户
提问于 2011-08-04 09:32:59
回答 4查看 860关注 0票数 1

我有一个Rails/ActiveRecord服务器,通过原生gem利用Postgres。我想知道Postgres是否/如何重用查询计划。例如,假设我的应用程序有这样的内容:

代码语言:javascript
运行
复制
ActiveRecord::Base.execute("select foo from t where id=5")
ActiveRecord::Base.execute("select foo from t where id=7")

Posgres会知道第二个SQL几乎与第一个完全相同,并重用现有的查询计划吗?

我不是在寻找“只使用模型!”的答案。或者什么不是;我只是想知道数据库中发生了什么。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-04 09:51:04

我不确定这是否正确,从我个人的观点来看,如果在你的应用程序中使用绑定变量,那么PostgreSQL服务器将重用现有的查询计划,而不需要解析,重新编写该计划。

另一种方法是在应用程序中使用PREPARE语句,当PREPARE语句被执行时,指定的语句将被解析、重写和计划。当随后发出EXECUTE命令时,预准备语句只需为executed.Thus,解析、重写和计划阶段只执行一次,而不是每次执行语句时都执行

有关“准备好的状态网”的更多信息,请查看http://www.postgresql.org/docs/9.0/static/sql-prepare.html

票数 1
EN

Stack Overflow用户

发布于 2011-08-04 10:16:19

我认为postgresql不会缓存这样的计划。当不同的常量传递给查询时,最佳计划可以是不同的。因此,生成新计划要比使用非最优计划更好。如果您需要这样的缓存,您可以使用准备好的语句或pl/pgsql函数。

票数 2
EN

Stack Overflow用户

发布于 2011-08-04 13:34:53

不,除非您显式地告诉服务器使用PREPARE (或特定于驱动程序的方法)创建预准备语句对象,否则会有缓存。您应该使用预准备语句,因为它们可以为您的应用程序提供开箱即用的SQL注入免疫力。

您的语句太简单了,即执行时间可能比生成查询计划要长得多。为了获得(已准备好的语句)的优势,您需要-在会话期间多次执行它-查询是复杂的(连接、触发器、函数、规则等)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6935193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档