PostgreSQL gist索引

PostgreSQL gist索引,postgresql,Postgresql,我有一个包含两个日期的表,比如dateTo和dateFrom,我想在查询中使用daterange方法和一个gist索引,但它似乎不起作用。该表如下所示: CREATE TABLE test ( id bigeserial, begin_date date, end_date date ); CREATE INDEX "idx1" ON test USING gist (daterange(begin_date, end_date)); 然后,当我试图解释

我有一个包含两个日期的表,比如dateTo和dateFrom,我想在查询中使用daterange方法和一个gist索引,但它似乎不起作用。该表如下所示:

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','[]')
我做了序列扫描


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

您在表达式
daterange(begin\u date,end\u date)
上有一个索引,但您使用
daterange(begin\u date,end\u date,“[]”和&……
查询表。PostgreSQL不会代替你做数学。要重新表述您的问题,就像您正在索引
(int\u col+2)
和查询
其中int\u col+1>2
。因为这两个表达式不同,所以在任何情况下都不会使用索引。但正如你所看到的,你有时可以做数学运算(即重新表述公式)

您需要:

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

注意:它们都创建了一个范围,其中包括
end\u date
。后者使用了
daterange
是离散的这一事实

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

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


注意:
&
右侧范围构造函数的第三个参数无关紧要(在索引使用的上下文中)。

为什么不在开始日期和结束日期使用B树多列索引?我想如果你有几行,你可能会得到一个序列扫描。可能您需要足够的数据来对实现进行压力测试。您试图使用错误表达式的表达式索引。索引中有
daterange(begin\u date,end\u date)
,但查询表时使用
daterange(begin\u date,end\u date,[])
(注意第三个参数)。@andrei macarie我使用gist索引,因为b树不支持范围运算符。@pozs这不是真的。索引将同时使用这两种方法。您需要使用seqscan提供解释分析,并且
set enable_seqscan=0和相同的解释分析。
WHERE daterange(begin_date, end_date, '[]') && daterange(?, ?, ?)
WHERE daterange(begin_date, end_date + 1) && daterange(?, ?, ?)