PostgreSQL手动更改查询执行计划以强制使用排序和顺序访问而不是完全扫描 [英] PostgreSQL manualy change query execution plan to force using sort and sequential access instead of full scan

查看:484
本文介绍了PostgreSQL手动更改查询执行计划以强制使用排序和顺序访问而不是完全扫描的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的查询,例如:

I have simple query like this:

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%。表格中大约有2000000条记录,并且每天都在增长。此查询的查询计划说明显示了对整个表使用seq扫描,然后执行排序和限制。

I have index for field f4 (for other queries). Condition "f1 > 42 AND f2 = 'foo' AND f3 = 'bar'" is not representative and corresponds to 70% of records in table t1. It's about 2 000 000 records in table and it is growing up every day. Query plan explanation for this query shows using of seq scan by entire table and then performing ordering and limitation.

是否可以说Postgres这样执行此查询: / p>

Is it possible to say Postgres to perform this query thus way:


  1. 使用字段f4上的索引遍历反向排序的行。

  2. 对于每一行,都要与条件f1> 42 AND f2 ='foo'和
    f3 ='bar'进行比较,并在对应的情况下使用。

  3. 如果结果集大小大于限制,则停止迭代。


推荐答案

此处 是查询计划程序的配置。您可以操纵它们来更改查询计划(对于您的情况,可以简单地 SET enable_seqscan = off; 用于此查询)。

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

But before you change the planner configuration - check if statistics on this table are correct and collect them again if needed.

这篇关于PostgreSQL手动更改查询执行计划以强制使用排序和顺序访问而不是完全扫描的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆