我有一张表hstore
列,大约 22 mio记录(表格来自部分osm数据库)。
尽管hstore列上有 GIN 索引,但对特定代码的查询会产生顺序表扫描,其中> 60秒返回单列。
到目前为止我一直在做什么。
vacuum analayze
select id from table where tags->'name'='foo'
analyze
来更新表统计信息。但那没有效果。
您可以查看查询计划here。出于某种原因,explain analyze
只需要约20秒即可完成。
如何正确索引像这样的大型表上的hstore列,以显着降低查询执行成本?
感谢您的帮助!
答案 0 :(得分:1)
我看到两种可能的解决方案:
如果总是查询该键值是否相等,则可以在表达式上使用B-Tree索引(`tags - >'name')
create index idx_name on ways ( (tags -> 'name') );
快速测试表明,Postgres确实使用索引来查找hstore列中是否存在键值,但显然不是用于查找关联值。
因此,您可以尝试添加条件来测试该键值:
select id
from ways
where tags ? 'name'
and tags -> 'name' = 'Wiehbergpark';
如果所有行都包含该键,则可能没有用。