Ваш SQL фактически выполняет поиск нескольких полигонов в пределах указанного расстояния для каждой точки.Результат однозначного соответствия между incident_geog.incident_id
и watchzones_geog.id
.Потому что вы работаете в каждой точке, поэтому он использует последовательное сканирование.
Полагаю, вы хотите начать с Polygon, чтобы найти точку.Таким образом, ваш SQL должен изменить таблицу.
explain select i.incident_id,wz.id from incident_geog i, watchzones_geog wz where ST_DWithin(position,incident_span,50);
мы можем видеть:
Nested Loop (cost=0.27..876.00 rows=1 width=16)
-> Seq Scan on incident_geog i (cost=0.00..22.00 rows=1200 width=40)
-> Index Scan using watchzones_geog_gix on watchzones_geog wz (cost=0.27..0.70 rows=1 width=40)
Index Cond: ("position" && _st_expand(i.incident_span, '50'::double precision))
Filter: ((i.incident_span && _st_expand("position", '50'::double precision)) AND _st_dwithin("position", i.incident_span, '50'::double precision, true))
Поскольку вы работаете с каждым ордером, всегда есть таблица, которая пересекает все записи при последовательном сканировании,Результаты этих двух SQL не отличаются.Ключ в том, в какой таблице вы начинаете искать порядок другой таблицы.
Может быть, вы можете попробовать Parallel Query
.Не используйте Parallel Query
:
SET parallel_tuple_cost TO 0;
explain analyze select i.incident_id,wz.id from incident_geog i, watchzones_geog wz where ST_DWithin(position,incident_span,50);
Nested Loop (cost=0.27..876.00 rows=1 width=16) (actual time=0.002..0.002 rows=0 loops=1)
-> Seq Scan on incident_geog i (cost=0.00..22.00 rows=1200 width=40) (actual time=0.002..0.002 rows=0 loops=1)
-> Index Scan using watchzones_geog_gix on watchzones_geog wz (cost=0.27..0.70 rows=1 width=40) (never executed)
Index Cond: ("position" && _st_expand(i.incident_span, '50'::double precision))
Filter: ((i.incident_span && _st_expand("position", '50'::double precision)) AND _st_dwithin("position", i.incident_span, '50'::double precision, true))
Planning time: 0.125 ms
Execution time: 0.028 ms
Попробуйте Parallel Query
и установите parallel_tuple_cost
как 2:
SET parallel_tuple_cost TO 2;
explain analyze select i.incident_id,wz.id from incident_geog i, watchzones_geog wz where ST_DWithin(position,incident_span,50);
Nested Loop (cost=0.27..876.00 rows=1 width=16) (actual time=0.002..0.002 rows=0 loops=1)
-> Seq Scan on incident_geog i (cost=0.00..22.00 rows=1200 width=40) (actual time=0.001..0.001 rows=0 loops=1)
-> Index Scan using watchzones_geog_gix on watchzones_geog wz (cost=0.27..0.70 rows=1 width=40) (never executed)
Index Cond: ("position" && _st_expand(i.incident_span, '50'::double precision))
Filter: ((i.incident_span && _st_expand("position", '50'::double precision)) AND _st_dwithin("position", i.incident_span, '50'::double precision, true))
Planning time: 0.103 ms
Execution time: 0.013 ms