【问题标题】:Setting enable_seqscan = off in a single SELECT query在单个 SELECT 查询中设置 enable_seqscan = off
【发布时间】:2013-02-16 09:58:33
【问题描述】:

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

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

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

我的 postgres 在 CentOS Linux 上是 8.4.9。

【问题讨论】:

    标签: php postgresql indexing query-optimization settings


    【解决方案1】:

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

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

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

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

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

    而且effective_cache_size 通常设置得太低,开箱即用。

    例外情况适用,有时查询规划器无法理解,尤其是旧版本。这让我想到了另一个微妙的观点:upgrade to a more current version of PostgreSQL。稳定版本是 9.2。自 Postgres 8.4 以来,查询计划器已经有了很大的改进。

    【讨论】:

    • 在实际情况下,您的用户会遭受痛苦,您并不总是可以随时进行全面调查或重新启动数据库。至少 Postgres 应该像其他所有主要的 RDBMS 一样提供索引提示,因此您可以在制定更好的永久解决方案的同时使事情正常进行。
    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2018-07-08
    • 2023-02-25
    • 2015-10-29
    • 2021-02-01
    • 2018-10-10
    • 1970-01-01
    • 2017-05-12
    相关资源
    最近更新 更多