在 postgresql 中使用 st_contains 连接两个大型 postgresql 几何表的最快方法是什么?
What is the fastest way to join two large postgresql tables on geometry using st_contains in postgresql?
我正在尝试在几何上连接两个相对较大的 table。几何体 A 由大的多边形组成。几何 B 由较小的多边形组成。我想左连接几何 A 包含几何 B 的行。几何 B 的多边形可能在几何 A 的边缘,但不在几何 A 的外部。两个几何都需要在 srid = 28992 上,而它们目前不是。我发现即使两个几何图形都已索引,下面的代码也非常慢。什么是加速该过程的有用方法?
SELECT ST_GeomFromText(
ST_AsText(
CAST(rek.geometry AS TEXT)
), 28992
), *
FROM rek
left join pvc
on st_contains(rek.geometry, st_transform(pvc.geometry, 28992))
DDL
对于table一个
-- Drop table
-- DROP TABLE rek;
CREATE TABLE rek (
geometry geometry NULL,
perceel varchar NULL,
naam varchar NULL
);
CREATE INDEX campagne_klanten_geom_idx_new ON dl_eigenaarsdata.valid_geom_final_kadaster USING gist (geometry);
CREATE INDEX geom_idx_new ON dl_eigenaarsdata.valid_geom_final_kadaster USING gist (geometry);
对于table乙
-- Drop table
-- DROP TABLE pvc;
CREATE TABLE pvc (
id varchar(16) NULL,
geometry geometry(POLYGON, 28992) NULL,
);
CREATE INDEX pand_view_clean_geometry_idx ON dl_deeb.pand_view_clean USING gist (geometry);
CREATE INDEX pand_view_clean_gm_wk_bu_naam_idx ON dl_deeb.pand_view_clean USING btree (gm_naam, wk_naam, bu_naam);
CREATE INDEX pand_view_clean_id_idx ON dl_deeb.pand_view_clean USING btree (id);
CREATE INDEX pand_view_clean_pandtype_idx ON dl_deeb.pand_view_clean USING btree (pand_type);
CREATE INDEX pand_view_clean_postcode_idx ON dl_deeb.pand_view_clean USING btree (postcode);
st_contains
不会使用geometry索引,因为没有直接使用geometry字段
您需要在转换后的几何图形上创建索引:
CREATE INDEX transformed_geometry_idx ON pvc USING gist (st_transform(geometry, 28992));
此外,主要的 select
太复杂了。它可以被替换为 select st_setSrid(rek.geometry, 28992)
我正在尝试在几何上连接两个相对较大的 table。几何体 A 由大的多边形组成。几何 B 由较小的多边形组成。我想左连接几何 A 包含几何 B 的行。几何 B 的多边形可能在几何 A 的边缘,但不在几何 A 的外部。两个几何都需要在 srid = 28992 上,而它们目前不是。我发现即使两个几何图形都已索引,下面的代码也非常慢。什么是加速该过程的有用方法?
SELECT ST_GeomFromText(
ST_AsText(
CAST(rek.geometry AS TEXT)
), 28992
), *
FROM rek
left join pvc
on st_contains(rek.geometry, st_transform(pvc.geometry, 28992))
DDL
对于table一个
-- Drop table
-- DROP TABLE rek;
CREATE TABLE rek (
geometry geometry NULL,
perceel varchar NULL,
naam varchar NULL
);
CREATE INDEX campagne_klanten_geom_idx_new ON dl_eigenaarsdata.valid_geom_final_kadaster USING gist (geometry);
CREATE INDEX geom_idx_new ON dl_eigenaarsdata.valid_geom_final_kadaster USING gist (geometry);
对于table乙
-- Drop table
-- DROP TABLE pvc;
CREATE TABLE pvc (
id varchar(16) NULL,
geometry geometry(POLYGON, 28992) NULL,
);
CREATE INDEX pand_view_clean_geometry_idx ON dl_deeb.pand_view_clean USING gist (geometry);
CREATE INDEX pand_view_clean_gm_wk_bu_naam_idx ON dl_deeb.pand_view_clean USING btree (gm_naam, wk_naam, bu_naam);
CREATE INDEX pand_view_clean_id_idx ON dl_deeb.pand_view_clean USING btree (id);
CREATE INDEX pand_view_clean_pandtype_idx ON dl_deeb.pand_view_clean USING btree (pand_type);
CREATE INDEX pand_view_clean_postcode_idx ON dl_deeb.pand_view_clean USING btree (postcode);
st_contains
不会使用geometry索引,因为没有直接使用geometry字段
您需要在转换后的几何图形上创建索引:
CREATE INDEX transformed_geometry_idx ON pvc USING gist (st_transform(geometry, 28992));
此外,主要的 select
太复杂了。它可以被替换为 select st_setSrid(rek.geometry, 28992)