2013-01-19 21 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);