2013-01-21 18 views
3

我有一個很大的數據集合,我想稍後用於用戶搜索。 目前我有200萬資源(〜50GB)。對於每一個,我有緯度+經度。目標是創建空間索引以便能夠對其執行空間查詢。 因此,計劃是使用PostgreSQL + PostGIS。在PostgreSQL + PostGIS上插入數百萬行,轉換數據並處理它的高效方法

我的數據在CSV文件。我試圖使用自定義函數不插入重複,但經過幾天的處理,我放棄了。我找到了一種快速將數據加載到數據庫的方法:使用COPY只需不到2個小時。

然後,我需要在幾何格式上轉換緯度+經度。爲此,我只需要這樣做:

ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326)) 

經過一番檢查後,我看到2億的點數,我有5000萬點。所以,我認爲最好的方法是創建一個將存儲所有點的表「TABLE_POINTS」和一個將使用point_key存儲資源的表「TABLE_RESOURCES」。

所以我需要從臨時表「TABLE_TEMP」填充「TABLE_POINTS」和「TABLE_RESOURCES」,而不是保留重複。

對於「點」我所做的:

INSERT INTO TABLE_POINTS (point) 
SELECT DISTINCT ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326)) 
FROM TABLE_RESOURCES 

我不記得多少時間了,但我認爲這是幾個小時的事。

然後,填寫「資源」,我想:

INSERT INTO TABLE_RESOURCES (...,point_key) 
SELECT DISTINCT ...,point_key 
FROM TABLE_TEMP, TABLE_POINTS 
WHERE ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326) = point; 

但同樣需要數天時間,有沒有辦法看到查詢多遠......

而且一些重要的東西,資源數量將繼續增長,目前應該像白天增加100K,因此應優化存儲以保持對數據的快速訪問。

所以,如果你有任何想法的加載或優化的存儲,歡迎您。

回答

0

研究優化postgres第一(即谷歌postgres未記錄,沃爾和fsync選項),第二你真的需要點是獨一無二的?也許只是將一張表與資源和點結合起來,不用擔心重複的點,因爲看起來你的重複查找可能很慢。

0

要使DISTINCT有效地工作,您需要在需要消除重複項的列(例如緯度/經度列,甚至是所有列的集合)上使用數據庫索引。

因此,首先將所有數據插入臨時表中,然後CREATE INDEX(通常事先創建索引的速度更快,因爲在插入過程中保留索引的代價高昂),並且只能在INSERT INTO ... SELECT DISTINCT之後進行。

EXPLAIN <your query>可以告訴你SELECT DISTINCT現在是否使用索引。

相關問題