2013-01-19 25 views
0

我有一个查询的工作,但想知道是否有一个更快,我可以使用较钝的窗体。我已经在几何体周围创建了一个边界框来缩小搜索范围,但对ST_Transforms的多次调用看起来很尴尬。顺便说一句:两条线(gg和gm)具有相同的点。POSTGIS SELECT optmization

由于提前,
-Matt

CREATE TABLE lines 
(
    line_id bigserial NOT NULL, 
    line_gm_bbox geometry, 
    line_gm_line geometry, 
    line_gg_line geography(LineString,4326), 
) 
WITH (OIDS=FALSE); 

CREATE INDEX line_bbox_idx 
    ON lines 
    USING gist 
    (line_gm_bbox); 


SELECT l.* FROM lines AS l WHERE l.line_gm_bbox && ST_Transform(ST_Buffer(ST_Transform(ST_GeomFromText('POINT(-71.44513306666667 42.7368536)',4326),3395), 2000), 4326) 
          AND ST_DWithin(l.line_gg_line, ST_GeomFromText('POINT(-71.44513306666667 42.7368536)',4326), 200); 

回答

1

使用ST_BufferWHERE是昂贵的,因为这将需要过滤前要缓冲所有的几何形状。同样的效果只能使用ST_DWithin

此外,lines表架构是矫枉过正。您只需要一个地理栏,不需要转换查询度量距离。边界框应该在技术上存储在要点索引中,但如果您需要某种用途,则可将其提取到box type中。只要主要指标在那里,大多数时候你不需要关心。

重新定义lines表,一个简单的模式:

CREATE TABLE lines 
(
    gid bigserial primary key, 
    geog geography(LineString,4326) 
); 
CREATE INDEX ON lines USING gist (geog); 

如果你想查询不到200米的点,所有感兴趣的线路,简化查询为:

SELECT l.* 
FROM lines AS l 
WHERE ST_DWithin(l.geog, ST_MakePoint(-71.44513306666667, 42.7368536), 200);