Rad*_*avu 6 postgresql performance index-tuning query-performance
我将OpenStreetMap 的planet.osm 文件大面积导入到postgresql 数据库中。数据库包含一个称为节点的表。每个节点都有一个名为 geom 的几何列和一个名为 tags 的 hstore 列。我需要沿着标记列中具有某些键的线提取节点。为此,我使用以下查询:
SELECT id, tags
FROM nodes
WHERE ST_DWithin(nodes.geom, ST_MakeLine('{$geom1}', '{$geom2}'), 0.001)
AND tags ? '{$type}';
Run Code Online (Sandbox Code Playgroud)
$geom1 和 $geom2 是我的线的起点和终点的几何图形。
$type 变量包含我要搜索的键。现在,它可以具有以下值之一:“historic”或“tourist”。
上面给出的查询有效,但速度太慢。我想在标签列中搜索键需要太多时间。我阅读了 GIN 和 GIST 索引,并使用以下查询生成了 GIN 索引:
CREATE INDEX nodes_tags_idx ON nodes USING GIN(tags);
Run Code Online (Sandbox Code Playgroud)
创建索引后,我使用相同的第一个查询再次搜索节点,但性能没有变化。
如何正确使用 GIN 和 GIST 来索引标签列,以便我可以更快地搜索在标签列中具有特定键的节点?
谢谢
您可以尝试像下面的示例一样对键进行索引,并查看其工作原理:
CREATE INDEX nodes_tags_key_historic_idx on nodes ( (tags->'historic') );
CREATE INDEX nodes_tags_key_tourist_idx on nodes ( (tags->'tourist') );
ANALYZE nodes;
Run Code Online (Sandbox Code Playgroud)
使用 EXPLAIN ANALYZE 运行时,您的查询计划是什么样的?
[编辑]:替代索引:
CREATE INDEX nodes_tags_key_tourist_idx2 on nodes ( (tags ? 'tourist') );
CREATE INDEX nodes_tags_key_historic_idx2 on nodes ( (tags ? 'historic') );
Run Code Online (Sandbox Code Playgroud)
后者不需要对您的查询进行任何更改。