2017-09-07 8 views
2

を選択:は、一つは、同じ2つのより遅い作品を登録しよう私はこのクエリを持って

SELECT * 
FROM placex AS place 
WHERE ST_DWithin(geometry, (SELECT geometry FROM placex WHERE place_id = 412369), 300) 
AND name->'name' = (SELECT name->'name' FROM placex WHERE place_id = 412369) 

リードタイム:530-650ms

このクエリを使用し2つのSELECT、それは醜いだと私は加入を使って書き直したいです。しかし、このクエリ:

SELECT same.* 
FROM placex AS same 
JOIN placex AS place ON place.place_id = 412369 
WHERE ST_DWithin(same.geometry, place.geometry, 300) 
AND same.name->'name' = place.name->'name'; 

2.8secで行われます。すべてのインデックスがデフォルトで表示されます(Nominatimによる)。 2番目のクエリを最適化する方法最初に使用しても大丈夫ですか?

のPostgreSQL 9.6.4、PostGISの2.3.3 r15473

EXPLAIN (ANALYZE, BUFFERS)

+0

http://wiki.postgresql.org/wiki/Slo –

+0

EXPLAIN(ANALYZE、BUFFERS)へのリンクを追加してください –

+0

'EXPLAIN ANALYZE'の出力を見れば、それらは同等のクエリではありません。 JOINバージョンは25行を生成し、サブ選択バージョンは1を生成します。 – eurotrash

答えて

0

私は原因を推測することができませんでしたが、私はあなたがこの

SELECT same.* 
FROM placex AS same 
     JOIN (SELECT name, 
        geometry 
      FROM placex 
      WHERE place_id = 412369) AS place 
     ON ST_DWithin(same.geometry, place.geometry, 300) 
      AND same.name->'name' = place.name->'name'; 

のようなあなたの2番目のクエリを書き換えるために試みることができると思いますまたは、最初のクエリを次のように書き直すことができます。

SELECT * 
FROM placex AS place 
WHERE EXISTS 
     ( 
       SELECT 1 
       FROM placex AS same 
       WHERE same.place_id = 412369 
       AND ST_DWithin(place.geometry, same.geometry, 300) 
       AND same.name->'name' = place.name->'name'); 
関連する問題