1

我正在尝试加入两个相对较大的几何表。几何 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

对于表 A

-- 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);

对于表 B

-- 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);
4

1 回答 1

2

st_contains不会使用几何索引,因为几何字段不直接使用。

您需要在转换后的几何图形上创建一个索引:

CREATE INDEX transformed_geometry_idx ON pvc USING gist (st_transform(geometry, 28992));

此外,主要select是不必要的过于复杂。它可以替换为select st_setSrid(rek.geometry, 28992)

于 2019-07-13T02:11:15.230 回答