我有一个大的(30M行)简单表格...
CREATE TABLE "Foo"."Bar" (
"BarID" BIGSERIAL PRIMARY KEY,
"DateTime" TIMESTAMP NOT NULL,
"Bar" TEXT NOT NULL
);
一个简单的索引:
CREATE INDEX ON "Foo"."Bar"("DateTime");
...还有一个简单的问题:
在2015年的第一小时,哪些"BarID"
值具有"DateTime"
值?
所以我创建了这个查询 #1:
SELECT
"Bar"."BarID"
FROM
"Foo"."Bar"
WHERE
"Bar"."DateTime" <@ TSRANGE('2015-01-01 00:00:00', '2015-01-01 01:00:00');
"...和这个查询 #2:"
SELECT
"Bar"."BarID"
FROM
"Foo"."Bar"
WHERE
"Bar"."DateTime" BETWEEN '2015-01-01 00:00:00' AND '2015-01-01 01:00:00';
结果
查询 #1 使用序列扫描需要 60 秒。
查询 #2 使用索引扫描只需要 0.02 秒。
我尝试使用 USING GiST
创建了另一个索引,但没有改善。
为什么会这样呢?
BETWEEN
是sargable,而TSRANGE()
则不是。 - Dour High Arch