3

我有大量的数据,我想稍后用于用户搜索。目前我有 2 亿资源(~50GB)。对于每个,我都有纬度+经度。目标是创建空间索引以便能够对其进行空间查询。因此,计划是使用 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,所以应该优化存储以保持对数据的快速访问。

因此,如果您对存储的加载或优化有任何想法,欢迎您。

4

2 回答 2

0

首先考虑优化 postgres(即 google postgres unlogged、wal 和 fsync 选项),其次你真的需要点是唯一的吗?也许只有一张包含资源和积分的表格,而不必担心重复的积分,因为看起来您的重复查找可能很慢。

于 2013-01-21T15:34:01.713 回答
0

为了DISTINCT有效地工作,您需要在要消除重复的那些列上建立数据库索引(例如,在纬度/经度列上,甚至在所有列的集合上)。

所以首先将所有数据插入到你的临时表中,然后CREATE INDEX(这通常比预先创建索引更快,因为在插入过程中维护它的成本很高),然后才执行INSERT INTO ... SELECT DISTINCT.

An EXPLAIN <your query> can tell you whether the SELECT DISTINCT now uses the index.

于 2014-07-12T17:23:17.597 回答