0

假设我有一个包含 2000 万行的表,我想像这样索引:

CREATE INDEX fruit_color
  ON fruits
  USING btree
  (color);

现在假设只有 2% 的水果有颜色,其余的都是NULL。我的查询永远不会想找到有颜色NULL(没有颜色)的水果,所以问题是,如果我将索引更改为,它会对 postgresql 产生影响:

 CREATE INDEX fruit_color
  ON fruits
  USING btree
  (color)
  WHERE color IS NOT NULL;

我对 postgresql 处理索引的内部方式了解不多,所以这就是我问的原因。

PS postgresql版本是9.2

4

1 回答 1

0

是的,这会有所作为。差异有多大取决于索引的使用方式。

如果只有一种水果具有某种颜色,而您按颜色搜索这种水果,则不会有太大区别;可能会少访问一页(因为索引的深度可能少了一级)。

如果某种颜色的水果有很多,改进会很大,因为扫描整个索引(对于位图索引扫描)或更大的部分(对于常规或仅索引扫描)会便宜得多. 如果索引很大,PostgreSQL 将更不愿意扫描完整的索引,可能会选择顺序表扫描。

于 2016-12-01T09:57:05.853 回答