0

我想在一个大表上运行一个查询,如下所示:

SELECT DISTINCT user FROM tasks WHERE ctime >= '2012-01-01' AND ctime < '2013-01-01' AND parent IS NULL;

tasks(ctime) 上已经有一个索引,但大多数 (75%) 行都有一个非 NULL 父级,所以这不是很有效。

我试图为这些行创建部分索引:

CREATE INDEX CONCURRENTLY task_ctu_np ON tasks (ctime, user) WHERE parent IS NULL;

但查询规划器继续选择任务(ctime)索引而不是我的部分索引。

我在服务器上使用的是 postgresql 8.2,而我的 psql 客户端是 8.1。

4

1 回答 1

1

首先,我赞同 Richard 的建议,即升级应该是您的首要任务。据我了解,部分索引等领域自 8.2 以来有了显着改善。

第二件事是您确实需要带有时间信息的实际查询计划(EXPLAIN ANALYZE),因为没有这些我们就无法谈论选择性等。

因此,如果我是您,我的工作顺序是先升级然后再进行调整。

现在,我知道 8.3 是一次重大升级(它是唯一导致我们在 LedgerSMB 中出现问题的升级)。您可能需要一些时间来解决这个问题,但另一种选择是进一步落后,并随着时间的推移就当前理解越来越少的版本提出问题。

于 2013-11-10T14:16:02.837 回答