我想在大表上运行查询:
SELECT DISTINCT用户FROM任务 WHERE ctime> ='2012-01-01'AND ctime< '2013-01-01'AND parent IS NULL;
已经有一个关于任务的索引(ctime),但是大多数(75%)的行都有一个非NULL父级,所以这不是很有效。
我尝试为这些行创建部分索引:
CREATE INDEX CONCURRENTLY task_ctu_np ON任务(ctime,user) 父级IS NULL;
但查询计划程序继续选择任务(ctime)索引而不是我的部分索引。
我在服务器上使用postgresql 8.2,而我的psql客户端是8.1。
答案 0 :(得分:1)
首先,我理解第二个理查德的建议,即升级应该是您的首要任务。据我所知,部分指数等领域自8.2以来有显着改善。
第二件事是你真的需要带有时间信息(EXPLAIN ANALYZE
)的实际查询计划,因为没有这些我们就不能谈论选择性等。
因此,如果我是你的话,我的业务订单将首先升级 ,然后再调整。
现在,我知道8.3是一个很大的升级(它是唯一一个导致我们在LedgerSMB中出现问题的人)。您可能需要一些时间来解决这个问题,但另一种方法是进一步落后,并随着时间的推移对当前理解中越来越少的版本提出问题。