PostgreSQL gist索引
我有一个包含两个日期的表,比如dateTo和dateFrom,我想在查询中使用daterange方法和一个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)); 然后,当我试图解释
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(?, ?, ?)