0

我有这样的简单查询:

SELECT  *
FROM    t1
WHERE   f1 > 42
        AND f2 = 'foo'
        AND f3 = 'bar'
ORDER BY f4 DESC 
LIMIT 10 OFFSET 100;

我有字段f4的索引(用于其他查询)。条件“f1 > 42 AND f2 = 'foo' AND f3 = 'bar'”不具有代表性,对应表 t1 中 70% 的记录。表中大约有 2 000 000 条记录,并且每天都在增长。此查询的查询计划说明显示使用整个表的 seq 扫描,然后执行排序和限制。

是否可以说 Postgres 以这种方式执行此查询:

  1. 通过使用字段 f4 上的索引来遍历反向排序的行。
  2. 对于每一行,与条件 f1 > 42 AND f2 = 'foo' AND f3 = 'bar' 进行比较,如果对应则取它。
  3. 如果结果集大小大于限制停止迭代。
4

2 回答 2

4

Here是查询计划器的配置。您可以操纵它们来更改查询计划(对于您的情况SET enable_seqscan = off;,此查询可能很简单)。

但在您更改规划器配置之前 - 检查此表上的统计信息是否正确,并在需要时再次收集它们。

于 2013-08-08T09:35:43.663 回答
1

据我了解,目标不仅是手动更改执行计划,还要继续获得与生产类似的执行计划。在这种情况下,带有优化器定义的游戏并不完全可靠。考虑到数据在不断增长,我想建议在生产和开发中实施分区,这将稳定执行计划。这将减少在执行计划生成中出错的可能性。作为替代表可能会通过 f4 上的索引定期聚集。不幸的是,没有足够的信息来推荐准确的分区策略。

于 2013-08-08T11:29:07.290 回答