【问题标题】:Efficient way of insert millions of rows, convert data and deal with it, on PostgreSQL+PostGIS在 PostgreSQL+PostGIS 上插入数百万行、转换数据和处理数据的高效方法
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      EXPLAIN <your query> 可以告诉您SELECT DISTINCT 现在是否使用索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2013-11-21
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        相关资源
        最近更新 更多