2011-08-29 135 views
1

如果我在緯度* 69和經度* 46上創建索引,以下查詢是否可以優化?PostgreSQL列索引查詢優化問題

select * from locations where abs(latitude*69 - 3036) <= 25 
          and abs(longitude*46 - 8970) <= 25 

或者我必須刪除abs()和代碼它更像是:

select * from locations where (latitude*69 - 3036) between -25 and 25 
          and (longitude*46 - 8970) between -25 and 25 

或甚至更簡單:

select * from locations where latitude*69 between 3036-25 and 3036+25 
          and longitude*46 between 8970-25 and 8970+25 
+1

爲什麼你不只是創建索引和測試它? – splash

+0

什麼,並做一些實際的工作? ;)我可以做你正在問的東西,但如果它沒有優化它,那麼我不知道如何改變它,以便優化。我無法在Postgres網站上找到任何討論什麼是和不可優化的文檔 - 您能爲此推薦任何資源嗎? –

回答

4

要查看查詢是否可以通過索引進行優化,最簡單的方法是做什麼。

在查詢之前創建一個GIST INDEX並使用EXPLAIN或EXPLAIN VERBOSE查看postgres使用的執行計劃。如果您看到類似掃描SEQ,則不是使用索引。如果您看到索引掃描,則使用該特定查詢的索引。

爲了使用GIS數據上的索引,必須使用使用geom/geog的邊界框的函數。 Postgis中的函數使用邊界框來使用索引,如所有的operators,或者一些使用內部運算符進行過濾的函數。

我認爲你可以做出最好的查詢,看看是否lonlat是在一個盒子裏(就是你正在嘗試做的?)是這樣的:

SELECT * 
FROM locations 
WHERE 
    ST_Dwithin(
     'POINT('||(longitude*46)||' '||(latitude*69)||')'::geometry, 
     'POINT(8970 3036)'::geometry 
    ) 

(未測試,但應該工作也與索引)

+0

謝謝你教我如何釣魚! ;)如果我的測試顯示它沒有優化它,那麼我不知道如何改變它以便優化。我無法在Postgres網站上找到任何討論什麼是和不可優化的文檔 - 您能爲此推薦任何資源嗎? –

+0

您必須閱讀Postgis文檔http://postgis.refractions.net/documentation/manual-1.5/reference.html 在每個功能文檔中,您會看到「註釋」,其中一些人會說他們會在每次使用索引時可用,如ST_Dwithin函數。 – jperelli

+0

你能接受答案嗎?謝謝! – jperelli

1

我從你的問題,你正在尋找的意義找到某個點周圍25個單位框內的點。只要locations只是點,任何postgres索引(GIN,GiST,b-tree,r-tree等)都可以在此查詢上正常工作。如果位置包含其他幾何形狀(手機信號塔接收的形狀,交付路線區域等),那麼您需要一個GiST r-tree。但總體而言,更好的方法是,因爲我從其他一些地理問題的印象中獲得了地理位置對於您所從事的工作至關重要的問題,因此可以使用PostGIS或至少geometry support built into Postgres。你的榜樣的直譯應該是:

select * from locations 
where my_point_column <@ box '((194.4, 43.36),(194.5 43.6))' 
反對用幾何類型列的Postgres

,和PostGIS的版本是多了很多的改進和公用事業的各種數據相同。

+0

點,你的意思是整數?我試圖把距離縮小到25英里(這比整個度還要小),因此分數是度數。如果通過點數來表示離散位置(地球平面上的一個點)與地區(例如城市或州)之間的距離,那麼您正確使用兩點之間的距離。我不想承擔計算最精確距離的處理開銷,所以我使用低開銷的替代方法在我的位置周圍的x英里方框(不是圓圈)內查找數據庫中的所有點。 –

+0

一個點只是2或3維記錄,如笛卡爾平面中的(1,1),它距(0,0)爲1.414。它不一定是一個整數,(1.414,1)。414)距離(0,0)爲2。 Postgres支持這些幾何形狀(請參閱鏈接)以及它們的索引。簡單的例子:假設你有點1 - >(123.4,56.7),2 - >(123.4,67.8)和3 - >(123.4,65.4)。通過在x,y座標中交錯10的冪來索引:3-> 10263544 1-> 10253647 2-> 10263748。看看最近的點是如何相鄰的?現在你有一個1維問題!對經度分別編制索引... – unmounted

+0

...和緯度將有所幫助,但它不會爲您帶來這些效率。另請參閱:http://blog.notdot.net/2009/11/Damn-Cool-Algorithms-Spatial-indexing-with-Quadtrees-and-Hilbert-Curves瞭解更多背景。 – unmounted