PostgreSQL:尽管有GiN索引,但在Hstore列上进行顺序表扫描

时间:2014-01-04 13:57:54

标签: sql postgresql indexing hstore

我有一张表hstore列,大约 22 mio记录(表格来自部分osm数据库)。

尽管hstore列上有 GIN 索引,但对特定代码的查询会产生顺序表扫描,其中> 60秒返回单列。

到目前为止我一直在做什么。

  1. 我使用pgAdminIII创建了GIN索引。
  2. 执行vacuum analayze
  3. 执行类型的查询:select id from table where tags->'name'='foo'
  4. 删除索引并从1.再次开始......
  5. [编辑]根据用户a_horse_with_no_name的建议,我通过在表上执行analyze来更新表统计信息。但那没有效果。
  6. enter image description here

    您可以查看查询计划here。出于某种原因,explain analyze只需要约20秒即可完成。

    如何正确索引像这样的大型表上的hstore列,以显着降低查询执行成本?

    感谢您的帮助!

1 个答案:

答案 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';

如果所有行都包含该键,则可能没有用。