web-dev-qa-db-ja.com

キーをより速く検索するためにhstoreタグ列に適切にインデックスを付ける方法

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}';

$ geom1と$ geom2は、ラインの始点と終点のジオメトリです。
$ type変数には、検索するキーが含まれています。現在は、「historic」または「tourist」のいずれかの値をとることができます。

上記のクエリは機能しますが、遅すぎます。タグ列でキーを検索するには時間がかかりすぎると思います。 GINインデックスとGistインデックスについて読み、次のクエリを使用してGINインデックスを生成しました。

CREATE INDEX nodes_tags_idx ON nodes USING GIN(tags);

インデックスを作成した後、同じ最初のクエリを使用してノードを再度検索しましたが、パフォーマンスに変化はありません。

タグ列に特定のキーを持つノードをより速く検索できるように、GINとGistを適切に使用してタグ列にインデックスを付けるにはどうすればよいですか?

ありがとうございました

6

次の例のようにキーのインデックスを作成して、それがどのように機能するかを確認できます。

CREATE INDEX nodes_tags_key_historic_idx on nodes ( (tags->'historic') );
CREATE INDEX nodes_tags_key_tourist_idx on nodes ( (tags->'tourist') );
ANALYZE nodes;

EXPLAIN ANALYZEで実行すると、クエリプランはどのようになりますか?

[編集]:代替インデックス:

CREATE INDEX nodes_tags_key_tourist_idx2 on nodes ( (tags ? 'tourist') );
CREATE INDEX nodes_tags_key_historic_idx2 on nodes ( (tags ? 'historic') );

後者では、クエリを変更する必要はありません。

4
bma