【发布时间】:2013-01-21 14:28:19
【问题描述】:
我有大量数据想在以后用于用户搜索。 目前我有 2 亿资源(~50GB)。对于每个,我都有纬度+经度。目标是创建空间索引以便能够对其进行空间查询。 因此,计划是使用 PostgreSQL + PostGIS。
我的数据在 CSV 文件中。我尝试使用自定义函数不插入重复项,但经过几天的处理我放弃了。我找到了一种在数据库中快速加载它的方法:使用 COPY 只需不到 2 小时。
然后,我需要将纬度+经度转换为几何格式。为此,我只需要这样做:
ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326))
经过一番检查,我看到 2 亿,我有 5000 万点。所以,我认为最好的方法是有一个表“TABLE_POINTS”来存储所有的点,以及一个表“TABLE_RESOURCES”来存储带有point_key的资源。
所以我需要从临时表“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;
但又需要几天时间,而且无法查看查询的距离...
还有一点很重要,资源的数量会不断增长,目前应该每天增加 10 万,所以应该优化存储以保持对数据的快速访问。
因此,如果您对存储的加载或优化有任何想法,欢迎您。
【问题讨论】:
标签: postgresql optimization loading postgis