POSTGRES-插入和更新以避免重复的最有效方法

时间:2018-10-24 09:14:49

标签: postgresql insert postgis

我不得不在我之前的那个家伙离开的地方拿起一个剧本,我需要一些帮助。

所以我有一些表,每个表都有近一百万行,我必须在结果表中执行INSERT,并从这些表中进行先前的SELECT。问题是我需要这个SELECT来获取两个表之间的距离,但是我只想插入一个距离最短的表(最近的邻居从一个表到另一个表。以下查询可以正确执行所有操作,但是会插入一个大表在给定距离内,从表P中的每个对象到表V中的每个对象的重复项的数量。要解决此问题,我有另一个查询,它针对表ID中的每个ID删除所有重复项,仅保留距离最短的重复项。 / p>

这对于较小的示例来说运行速度很快,但是当我进入实际的较大表时,由于磁盘会生成所有重复项,因此磁盘空间不足,然后才能进入删除重复项的查询。

INSERT INTO result(id_state, name_m, id_m, type_l, \
name_l, id_l, cab_l, name_c, \
type_d, di, \
numext, port, id5, gid, pro, \
Y, X, geom, distance,cat_v, type_v, vi, id_v) \
(select '{0}'m.name, l.cv, l.type,l.name, l.loc, l.cab, \
c.name,d.type, s.distr, \
p.numext, p.portal, p.id5, p.gid, p.pro, \
ST_Y(p.geom), ST_X(p.geom) ,p.geom, ST_DISTANCE(p.geom,v.geom), v.cat, v.type, v.name, v.id, \
FROM m, l, c, v, \
d, s \
WHERE p.state = '{0}'\
AND left(m.cm) = '{0}'\
AND p.id5 = {1}\
AND ST_INTERSECTS(p.geom, m.geom)\
AND ST_INTERSECTS(p.geom, l.geom)\
AND ST_INTERSECTS(p.geom, d.geom)\
AND ST_INTERSECTS(p.geom, s.geom)\
AND ST_DWithin(p.geom, v.geom,0.000524

我的下一个想法是仅更改查询并使其仅基于横向连接插入最近的邻居,但是与第一个连接相比,该查询的速度非常慢(完成与距离其他几个小时。

INSERT INTO result(id_state, name_m, id_m, type_l, \
name_l, id_l, cab_l, name_c, \
type_d, di, \
numext, port, id5, gid, pro, \
Y, X, geom, distance,cat_v, type_v, vi, id_v) \
(SELECT v1.* \
FROM portales p , \
lateral(select '{0}'m.name, l.cv, l.type,l.name, l.loc, l.cab, \
c.name,d.type, s.distr, \
p.numext, p.portal, p.id5, p.gid, p.pro, \
ST_Y(p.geom), ST_X(p.geom) ,p.geom, ST_DISTANCE(p.geom,v.geom), v.cat, v.type, v.name, v.id, \
FROM m, l, c, v, \
d, s \
WHERE p.state = '{0}' \
AND left(m.cm,2) = '{0}' \
AND p.id5 = {1} \
AND st_dwithin(p.geom, m.geom, 0) \
AND ST_INTERSECTS(p.geom, m.geom) \
AND st_dwithin(p.geom, l.geom, 0) \
AND ST_INTERSECTS(p.geom, l.geom) \
AND st_dwithin(p.geom, d.geom, 0) \
AND ST_INTERSECTS(p.geom, d.geom) \
AND st_dwithin(p.geom, s.geom, 0) \
AND ST_INTERSECTS(p.geom, s.geom) \
AND ST_DWithin(p.geom, v.geom, 0.000524) \
Order by p.id5, st_distance(p.geom,v.geom) limit 1) as v1)

因此,正如你们看到的那样,出于时空原因,即使它们在理论上也起作用,但它们都不是有效的。

我当时正在考虑使用第一个(第二个太慢了),并以某种条件来限制插入,例如UPDATE,其中ID5相同且距离小于存在的条件(冲突时)吗?),但我不知道这样做的效率如何,我无法全力以赴。另一方面,第二个从一开始就解决了复制问题,但是速度非常慢,因此,如果有一种方法可以将其从一周以上提高到几个小时/一天,那同样会很棒

请大家在删除重复项之前先看看我从第一个脚本中得到的结果,是这样的:

name_c       id5         distance
A             1            8.500 
B             1            0.003
C             1            0.002
A             1            8.500 
B             1            0.003
C             1            0.002
A             1            8.500 
B             1            0.003
C             1            0.002

然后,它最终更改为下一个id5并继续运行。我真的不知道为什么会产生如此多的重复。第一个脚本的速度很好,我只需要不要在表中插入那么多重复项即可。

谢谢。

0 个答案:

没有答案