Я пытаюсь сделать пространственное соединение между двумя таблицами:
- Таблица 1: особенности 397265 (с индексом гистограммы в поле geom)
- Таблица 2: 73 объекта (с основным индексом для поля geom)
Таблицы 1 и 2 имеют одинаковый SRID.
Я провел много тестов, и пространственное соединение между этими таблицами занимает несколько дней (через 5 дней я убил запрос). Я пытался понять, почему это так медленно с объяснением анализа:
EXPLAIN ANALYZE
SELECT
table1.id, table2.id
FROM table1
INNER JOIN table2 ON ST_Intersects(
ST_Buffer(table1.geom,0),
ST_Buffer(table2.geom,0)
)
Но пока я все еще жду результата, поскольку EXPLAIN ANALYZE действительно выполняет запрос.
Если я сделаю только ОБЪЯСНЕНИЕ, вот результат:
"Gather (cost=1000.00..3820127.08 rows=9667 width=40)"
" Workers Planned: 3"
" -> Nested Loop (cost=0.00..3818111.26 rows=3118 width=40)"
" Join Filter: ((st_buffer(table2.geom, '0'::double precision) && st_buffer(table1.geom, '0'::double precision)) AND _st_intersects(st_buffer(table2.geom, '0'::double precision), st_buffer(table1.geom, '0'::double precision)))"
" -> Parallel Seq Scan on table1 (cost=0.00..21964.50 rows=128150 width=344)"
" -> Seq Scan on table2 (cost=0.00..9.73 rows=73 width=714516)"
Я также обновил свой файл конфигурации postgresql относительно конфигурации моего компьютера:
shared_buffers = 8GB
effective_cache_size = 24GB
maintenance_work_mem = 2GB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 4
effective_io_concurrency = 2
work_mem = 10485kB
min_wal_size = 1GB
max_wal_size = 2GB
max_worker_processes = 7
max_parallel_workers_per_gather = 4
max_parallel_workers = 7
Не могли бы вы сказать мне, что это так долго?