2016-12-06 111 views
0

我有一个表有daterange列。我想选择包含今日日期的行。如果范围contains elementPostgresql索引范围类型

范围类型的索引与GiST index

取得

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

@>运营商是真实的,所以我创建了一个索引CREATE INDEX my_idx ON mytable USING gist (drange)

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

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

回答

1

该指数很好;可能该条件对于PostgreSQL选择索引的选择性不够。

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

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

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