POSTGIS SELECT优化

时间:2013-01-19 21:13:37

标签: postgresql postgis postgresql-9.1

我有一个有效的查询,但想知道是否有一个我可以使用的更快的钝角形式。我已经在我的几何体周围创建了一个边界框来缩小搜索范围,但是对ST_Transforms的多次调用似乎很尴尬。 BTW:两条线(gg和gm)具有相同的点。

提前致谢,
-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 个答案:

答案 0 :(得分:1)

ST_Buffer中使用WHERE的费用很高,因为在过滤之前需要缓冲几何所有。仅使用ST_DWithin获得相同的效果。

此外,lines表架构 overkill 。您只需要一个地理列,无需转换为查询度量标准距离。边界框应该在技术上存储在gist索引中,否则可以提取到box type,如果您出于某种目的需要它。大多数时候你不需要关心,只要有gist索引就可以了。

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