我有一个带有一hstore
列的表,大约有22个mio记录(来自部分osm数据库的ways表)。
尽管hstore列上有GIN索引,但查询特定标签会导致顺序表扫描,而该顺序表扫描需要60秒以上的时间才能返回单个列。
到目前为止,我一直在做什么。
vacuum analayze
select id from table where tags->'name'='foo'
analyze
在表上执行来更新表统计信息。但这没有效果。您可以在此处查看查询计划。由于某种原因,explain analyze
仅需约20秒即可完成。
我如何在这样的大表上正确索引hstore列,以显着降低查询执行成本?
谢谢您的帮助!
我看到两种可能的解决方案:
如果您始终查询该键值是否相等,则可以在表达式上使用B树索引(`标签->'名称')
create index idx_name on ways ( (tags -> 'name') );
快速测试表明,Postgres确实使用索引来查找hstore列中是否存在键值,但显然不是用于查找关联的值。
因此,您也可以尝试添加条件来测试该键值:
select id
from ways
where tags ? 'name'
and tags -> 'name' = 'Wiehbergpark';
如果所有行都包含该键,则可能无济于事。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句