ST_contains 花太多时间
ST_contains taking too much time
我正在尝试使用以下查询
将latitude/longitude匹配到特定的邻居位置
create table address_classification as (
select distinct buildingid,street,city,state,neighborhood,borough
from master_data
join
Borough_GEOM
on st_contains(st_astext(geom),coordinates) = 'true'
);
在此,坐标格式如下
ST_GeometryFromText('POINT('||longitude||' '||latitude||')') as coordinates
并且geom是column类型的geometry
我已经创建了如下索引
CREATE INDEX coordinates_gix ON master_data USING GIST (coordinates);
CREATE INDEX boro_geom_indx ON Borough_GEOM USING gist(geom);
我在主 table 中有将近 300 万条记录,在 GEOM table 中有 200 条几何信息。解释查询分析花费了如此多的时间(2 小时)。
请让我知道,我该如何优化这个查询。
提前致谢。
- 如评论中所述,请勿使用
ST_AsText()
:那不属于那里。它将 geom 转换为文本,然后返回到 geom。但是,更重要的是,该过程可能会弄乱索引。
- 如果您仅在列上独一无二,则使用
DISTINCT ON
,无需比较其他列。
- 如果您在 ID 列上是独一无二的,并且您唯一的加入是为了增加选择性,那么请考虑使用
EXISTS
。除了 geom
之外,这些列中的任何一个都来自 borough_GEOM
吗?
我会从这样的事情开始,
CREATE TABLE address_classification AS
SELECT DISTINCT ON (buildingid),
buildingid,
street,
city,
state,
neighborhood,
borough
FROM master_data
JOIN borough_GEOM
ON ST_Contains(geom,coordinates);
我正在尝试使用以下查询
将latitude/longitude匹配到特定的邻居位置create table address_classification as (
select distinct buildingid,street,city,state,neighborhood,borough
from master_data
join
Borough_GEOM
on st_contains(st_astext(geom),coordinates) = 'true'
);
在此,坐标格式如下
ST_GeometryFromText('POINT('||longitude||' '||latitude||')') as coordinates
并且geom是column类型的geometry
我已经创建了如下索引
CREATE INDEX coordinates_gix ON master_data USING GIST (coordinates);
CREATE INDEX boro_geom_indx ON Borough_GEOM USING gist(geom);
我在主 table 中有将近 300 万条记录,在 GEOM table 中有 200 条几何信息。解释查询分析花费了如此多的时间(2 小时)。 请让我知道,我该如何优化这个查询。
提前致谢。
- 如评论中所述,请勿使用
ST_AsText()
:那不属于那里。它将 geom 转换为文本,然后返回到 geom。但是,更重要的是,该过程可能会弄乱索引。 - 如果您仅在列上独一无二,则使用
DISTINCT ON
,无需比较其他列。 - 如果您在 ID 列上是独一无二的,并且您唯一的加入是为了增加选择性,那么请考虑使用
EXISTS
。除了geom
之外,这些列中的任何一个都来自borough_GEOM
吗?
我会从这样的事情开始,
CREATE TABLE address_classification AS
SELECT DISTINCT ON (buildingid),
buildingid,
street,
city,
state,
neighborhood,
borough
FROM master_data
JOIN borough_GEOM
ON ST_Contains(geom,coordinates);