在对我的一个查询(Postgres)进行多次测试后,我意识到通过设置enable_seqscan
= off,查询花费了其原始时间的 1/3(使用psql
控制台完成EXPLAIN ANALYZE
)
由于不建议为整个服务器更改此设置,因此我想将其设置为OFF
仅用于此查询。
我该怎么做?是否可以?
我的实现基于框架 Kohana (PHP),它使用 DB 对象 ( DB::select ) 来执行查询。
我的 postgres 在 CentOS Linux 上是 8.4.9。
在对我的一个查询(Postgres)进行多次测试后,我意识到通过设置enable_seqscan
= off,查询花费了其原始时间的 1/3(使用psql
控制台完成EXPLAIN ANALYZE
)
由于不建议为整个服务器更改此设置,因此我想将其设置为OFF
仅用于此查询。
我该怎么做?是否可以?
我的实现基于框架 Kohana (PHP),它使用 DB 对象 ( DB::select ) 来执行查询。
我的 postgres 在 CentOS Linux 上是 8.4.9。
你可以SET LOCAL
在你的交易中使用它。我引用手册:
持续到当前事务结束的效果
SET LOCAL
,无论是否已提交。
但这就像在你不断生病而不是找到原因时吃抗生素一样。通常,计划者选择次优计划是有原因的。你应该找到并修复它。看:
我怀疑较低的设置random_page_cost
可能对您有用。默认设置通常过于保守(过高)。如果您的大部分或全部数据库都被缓存(系统缓存会为重复使用并适合 RAM 的任何内容执行此操作),random_page_cost
则可能几乎与seq_page_cost
. random_page_cost
是计算索引使用成本的主要因素。
确保它autovacuum
正在运行并正确配置(处理VACUUM
和ANALYZE
)。您需要最新的列统计信息才能进行正确的查询计划。
并且effective_cache_size
经常开箱即用地设置得太低。
例外情况适用,有时查询规划器无法理解,尤其是旧版本。这让我想到了另一个微妙的问题:升级到当前版本的 PostgreSQL。你的已经过时了。