jua*_*onn 4 php postgresql indexing settings query-optimization
经过对我的一个查询(Postgres)的几次测试后,我意识到通过设置enable_seqscan
=关闭,查询占用原始时间的1/3(使用psql
控制台完成EXPLAIN ANALYZE
)
由于不建议为整个服务器更改此设置,因此我想将其设置为OFF
仅用于此查询.
我该怎么做?可能吗?
我的实现基于框架Kohana(PHP),它使用DB对象(DB :: select)来执行查询.
我在CentOS Linux上的postgres是8.4.9.
您可以SET LOCAL
在交易中使用它.我引用手册:
SET LOCAL
最后的影响直到当前交易结束,无论是否承诺.
但这就像在你生病而不是找病因时吃抗生素一样.通常有一个原因,为什么规划者选择一个次优计划,你应该找到并解决这个问题.在这个相关问题的答案中阅读更多相关内容:
保持PostgreSQL有时选择错误的查询计划
特别是我怀疑降低设置random_page_cost
可能是一个好主意.默认设置通常过于保守(太高).如果您的大部分或全部数据库都被缓存(系统缓存会对重复使用的任何内容执行此操作并适合RAM),random_page_cost
则几乎与所有数据库一样低(或者在极端情况下也一样低)seq_page_cost
.random_page_cost
是计算索引使用成本的主要因素.
并确保autovacuum正在运行并正确配置(照顾VACUUM
和ANALYZE
).您需要使用最新的统计信息来进行正确的查询规划.
并且effective_cache_size
定期设置得太低了.
例外情况适用,有时查询计划程序无法获取,特别是对于旧版本.这让我想到了另一个微妙点:升级到更新版本的PostgreSQL.稳定版本是9.2.自Postgres 8.4以来,查询规划器已经有了很大的改进.