gpt4 book ai didi

两个表之间的 Postgis ST_Intersects 真的(真的)很慢

转载 作者:行者123 更新时间:2023-12-02 16:55:05 47 4
gpt4 key购买 nike

我正在尝试在两个表之间进行空间连接:

  1. 表 1:397265 个特征(在 geom 字段上有 gist 索引)
  2. 表 2:73 个特征(在 geom 字段上有 gist 索引)

表 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 确实执行了查询。

如果我在这里只做一个 EXPLAIN 就是结果:

"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

你能告诉我它有多长吗?

最佳答案

不使用空间索引。

您可以删除 buffer 东西(也许先修复您的几何形状..)

INNER JOIN table2 ON ST_Intersects(table1.geom,table2.geom)

或者您可以在缓冲的几何图形上创建索引

CREATE INDEX geom_idx ON table1 USING gist (ST_Buffer(table1.geom,0));

关于两个表之间的 Postgis ST_Intersects 真的(真的)很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56836306/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com