在单个SELECT查询中设置enable_seqscan = off

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.

Erw*_*ter 9

您可以SET LOCAL在交易中使用它.我引用手册:

SET LOCAL最后的影响直到当前交易结束,无论是否承诺.

但这就像在你生病而不是找病因时吃抗生素一样.通常有一个原因,为什么规划者选择一个次优计划,你应该找到并解决这个问题.在这个相关问题的答案中阅读更多相关内容:
保持PostgreSQL有时选择错误的查询计划

特别是我怀疑降低设置random_page_cost可能是一个好主意.默认设置通常过于保守(太高).如果您的大部分或全部数据库都被缓存(系统缓存会对重复使用的任何内容执行此操作并适合RAM),random_page_cost则几乎与所有数据库一样低(或者在极端情况下也一样低)seq_page_cost.random_page_cost是计算索引使用成本的主要因素.

并确保autovacuum正在运行并正确配置(照顾VACUUMANALYZE).您需要使用最新的统计信息来进行正确的查询规划.

并且effective_cache_size定期设置得太低了.

例外情况适用,有时查询计划程序无法获取,特别是对于旧版本.这让我想到了另一个微妙点:升级到更新版本的PostgreSQL.稳定版本是9.2.自Postgres 8.4以来,查询规划器已经有了很大的改进.

  • 在实际情况下,您的用户会受到影响,您并不总是能够随时进行全面调查或重新启动数据库。至少 Postgres 应该像其他所有主要 RDBMS 一样提供索引提示,这样您就可以在开发更好的永久解决方案的同时使事情正常进行。 (2认同)