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 清空操作系统的文件系统缓存)来模拟它。
我有一个 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 清空操作系统的文件系统缓存)来模拟它。