1

我有一个带有布尔列的表 -"is_woman" bool DEFAULT true

我有这个列的 btree 索引(以及其他一些,如年龄、城镇等)-is_woman ASC NULLS LAST

我对此专栏有疑问 -is_woman IS FALSE

结果,我得到了解释:

-> Index Scan using woman_idx on superjob (cost=... rows=... width=32) (actual time=... rows=... loops=1)
 Index Cond: (town = 1) AND (is_woman = false) AND (age >= 35) AND (age <= 60))
 Filter: (is_woman IS FALSE)

为什么有两个 is_woman 条件?一个在索引部分,第二个在过滤器中?

更新

在@dmitry 的帮助下,我创建了两个部分索引:一个用于男性is_woman is false,第二个用于女性is_woman is true

Explain对于相同的查询:

Bitmap Index Scan on is_woman_woman_idx (...) (actual time=469.446..469.446 rows=406867 loops=1) Index Cond: ((age >= 1) AND (town = 1)) Execution time: 1827.239 ms

没有Filter部分,这个查询工作得更快:

  • 实际时间2.227..2754.378469.446..469.446
  • 执行时间2792.804 ms1827.239 ms
4

1 回答 1

1

更新

EXPLAIN除了您正在索引boolean列(显然,列具有低基数字段)之外,我看不出有什么问题。使用具有如下定义的部分索引可能是有益的:

CREATE INDEX ON yourtable WHERE is_woman = FALSE;

至于问题本身,您有一个带有WHERE ...条件的查询。Postgresplanner/optimizer决定使用woman_idx索引扫描而不是顺序扫描 -Index Cond用于索引扫描。

如果您可以看到Filter语句,则意味着计划节点检查它扫描的每一行(在我们的例子中是每次woman_idx扫描)的条件,并且只输出通过条件的那些。有关详细信息,请查看EXPLAIN文档。

于 2015-11-10T00:20:29.137 回答