PostgreSQL gist index



我有一个带有两个日期的表,例如dateto和date,我想在查询和要点索引中使用超音速方法,但似乎不起作用。桌子看起来像:

CREATE TABLE test (
  id         bigeserial,
  begin_date date,
  end_date   date
);
CREATE INDEX "idx1"
  ON test
  USING gist (daterange(begin_date, end_date));

然后,当我尝试解释一个查询时:

SELECT t.*
FROM test t
WHERE daterange(t.begin_date,t.end_date,'[]') && daterange('2015-12-30 00:00:00.0','2016-10-28 00:00:00.0','[]')

我得到了SEQ扫描。

这种要点索引的用法是错误的,还是这种情况不可行?

您在表达式daterange(begin_date, end_date)上有一个索引,但是您使用daterange(begin_date, end_date, '[]') && ...查询表。PostgreSQL不会做数学而不是您。为了重新复述您的问题,就像您要索引(int_col + 2)并查询WHERE int_col + 1 > 2一样。由于两个表达式不同,因此在任何情况下都不会使用该索引。但是,如您所见,您有时 can 有时会进行数学(即重新编写公式(。

您要么需要:

CREATE INDEX idx1 ON test USING gist (daterange(begin_date, end_date, '[]'));

或:

CREATE INDEX idx2 ON test USING gist (daterange(begin_date, end_date + 1));

Note :它们两个都创建了一个包括end_date的范围。后一个使用daterange是离散的事实。

并使用上述每个索引的以下谓词:

WHERE daterange(begin_date, end_date, '[]') && daterange(?, ?, ?)

或:

WHERE daterange(begin_date, end_date + 1) && daterange(?, ?, ?)

note &&的范围构造函数的第三个参数无关紧要(在索引使用情况下(。

最新更新