7

在对我的一个查询(Postgres)进行多次测试后,我意识到通过设置enable_seqscan= off,查询花费了其原始时间的 1/3(使用psql控制台完成EXPLAIN ANALYZE

由于不建议为整个服务器更改此设置,因此我想将其设置为OFF仅用于此查询。
我该怎么做?是否可以?

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

我的 postgres 在 CentOS Linux 上是 8.4.9。

4

1 回答 1

11

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

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

但这就像在你不断生病而不是找到原因时吃抗生素一样。通常,计划者选择次优计划是有原因的。你应该找到并修复它。看:

我怀疑较低的设置random_page_cost可能对您有用。默认设置通常过于保守(过高)。如果您的大部分或全部数据库都被缓存(系统缓存会为重复使用并适合 RAM 的任何内容执行此操作),random_page_cost则可能几乎与seq_page_cost. random_page_cost是计算索引使用成本的主要因素。

确保它autovacuum正在运行并正确配置(处理VACUUMANALYZE)。您需要最新的列统计信息才能进行正确的查询计划。

并且effective_cache_size经常开箱即用地设置得太低。

例外情况适用,有时查询规划器无法理解,尤其是旧版本。这让我想到了另一个微妙的问题:升级到当前版本的 PostgreSQL。你的已经过时了。

于 2013-03-01T20:04:05.640 回答