Postgresql 索引范围类型

Postgresql indexing a range type

我有一个 table,它有一个 daterange 列。我想要 select 行包含今天的日期。

select * from mytable where drange @> now()::date

如果范围 contains element

,则 @> 运算符为真

范围类型的索引是使用 GiST index

所以我创建了一个索引CREATE INDEX my_idx ON mytable USING gist (drange)

explain select * from mytable where drange @> now()::date 总是 returns

Seq Scan on mytable  (cost=0.00..1051.82 rows=26104 width=38)
   Filter: (drange @> (now())::date)

指标不错;可能是条件不够选择性,PostgreSQL 无法选择索引。

您可以降低参数 random_page_cost 以使 PostgreSQL 更倾向于索引扫描。

我建议您使用 EXPLAIN (ANALYZE) 和现在的顺序 schan 执行几次测试运行,然后将 random_page_cost 设置为较低的值(1、1.5或 2) 让 PostgreSQL 选择 索引扫描 位图索引扫描 。然后你会看到哪个选项最快——毕竟它可能是顺序扫描。

请注意运行多次查询会导致数据块被缓存,这可能会导致不切实际的好结果。您应该比较“冷”缓存的性能,您可以通过重新启动 PostgreSQL 服务器(and/or 清空操作系统的文件系统缓存)来模拟它。