我有一个带有两个日期的表,例如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 :右 &&
的范围构造函数的第三个参数无关紧要(在索引使用情况下(。