snippetsqlMinor
How to properly index hstore tags column to faster search for keys
Viewed 0 times
searchcolumnproperlyhstoretagsfasterkeysforhowindex
Problem
I imported a large area of OpenStreetMap's planet.osm file into a postgresql database. The database contains a table called nodes. Each node has a geometry column called geom and a hstore column called tags.
I need to extract nodes along a line that have certain keys in the tags column. To do that I use the following query:
$geom1 and $geom2 are geometries for start and end points of my line.
The $type variable contains the key I want to search for. Now, it can have one of the following values: 'historic' or 'tourist'.
The query given above works but it is too slow. I guess searching for a key in tags column takes too much time. I read about GIN and GIST indexes and I generated a GIN index using the following query:
After creating the index I searched again for nodes using the same first query but there is no change in performance.
How can I properly use GIN and GIST to index tags column so I can faster search for nodes that have a certain key in tags column?
Thank you
I need to extract nodes along a line that have certain keys in the tags column. To do that I use the following query:
SELECT id, tags
FROM nodes
WHERE ST_DWithin(nodes.geom, ST_MakeLine('{$geom1}', '{$geom2}'), 0.001)
AND tags ? '{$type}';$geom1 and $geom2 are geometries for start and end points of my line.
The $type variable contains the key I want to search for. Now, it can have one of the following values: 'historic' or 'tourist'.
The query given above works but it is too slow. I guess searching for a key in tags column takes too much time. I read about GIN and GIST indexes and I generated a GIN index using the following query:
CREATE INDEX nodes_tags_idx ON nodes USING GIN(tags);After creating the index I searched again for nodes using the same first query but there is no change in performance.
How can I properly use GIN and GIST to index tags column so I can faster search for nodes that have a certain key in tags column?
Thank you
Solution
You could try indexing the keys like in the following examples and see how that works:
What does your query plan look like when run with EXPLAIN ANALYZE?
[edit]: Alternative indexes:
The latter shouldn't require any changes to your query.
CREATE INDEX nodes_tags_key_historic_idx on nodes ( (tags->'historic') );
CREATE INDEX nodes_tags_key_tourist_idx on nodes ( (tags->'tourist') );
ANALYZE nodes;What does your query plan look like when run with EXPLAIN ANALYZE?
[edit]: Alternative indexes:
CREATE INDEX nodes_tags_key_tourist_idx2 on nodes ( (tags ? 'tourist') );
CREATE INDEX nodes_tags_key_historic_idx2 on nodes ( (tags ? 'historic') );The latter shouldn't require any changes to your query.
Code Snippets
CREATE INDEX nodes_tags_key_historic_idx on nodes ( (tags->'historic') );
CREATE INDEX nodes_tags_key_tourist_idx on nodes ( (tags->'tourist') );
ANALYZE nodes;CREATE INDEX nodes_tags_key_tourist_idx2 on nodes ( (tags ? 'tourist') );
CREATE INDEX nodes_tags_key_historic_idx2 on nodes ( (tags ? 'historic') );Context
StackExchange Database Administrators Q#45820, answer score: 4
Revisions (0)
No revisions yet.