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

时间:2013-03-01 19:41:36

标签: php postgresql indexing query-optimization settings

经过对我的一个查询(Postgres)的多次测试后,我意识到通过设置enable_seqscan = off,查询占用原始时间的1/3(使用psql控制台和{{ 1}})

由于不建议为整个服务器更改此设置,因此我只想将此设置设为EXPLAIN ANALYZE
我该怎么做?有可能吗?

我的实现基于框架Kohana(PHP),它使用DB对象(DB :: select)来执行查询。

我在CentOS Linux上的postgres是8.4.9。

1 个答案:

答案 0 :(得分:9)

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

  

SET LOCAL的效果仅持续到当前交易结束,无论是否已经提交。

但这就像在你生病时吃抗生素而不是找病因。通常有一个原因,为什么规划者选择一个次优计划,你应该找到并解决这个问题。在这个相关问题的答案中阅读更多相关信息:
Keep PostgreSQL from sometimes choosing a bad query plan

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

确保autovacuum正在运行并正确配置(负责VACUUMseq_page_cost)。您需要使用最新的统计信息来进行正确的查询规划。

ANALYZE定期设置得太低。

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