2017-12-18 86 views
2

我有一个包含边(几何)的亿行的表,其中一些是重复的,我使用以下查询删除重复的边。PostgreSQL中的分区表

DELETE FROM water_edges 
    WHERE id IN (
    SELECT e1.id 
    FROM water_edges e1, water_edges e2 
    WHERE st_equals(e1.geom_line, e2.geom_line) 
    AND e1.id < e2.id 
    ); 

不过,我有8个内核使用,我想充分利用它,如何更改查询或创建一个函数说只上同时运行的子集运行删除功能。

回答

0

你不能这样做(还)。

您可以并行运行其中几个查询。 如果您决定并行运行8,则将AND e1.id % 8 = 0添加到第一个,将第二个AND e1.id % 8 = 1添加到第二个等等。

查询速度不会线性缩放。如果幸运的话,查询可以共享相同的顺序扫描,但很可能是您的I/O系统成为瓶颈。

0

我在这些情况下通常会做的是创建一个脚本,将关键空间划分为连续的块并将查询分配给连接池中的连接。

这比模数更好,因为密钥空间中靠近彼此的元组可能在同一页(如果这是一个插入繁重的工作负载),因此您最大限度地减少了等待并在核之间传输缓冲区。

如果使用这种方法,请注意libpq(因此大多数客户端驱动程序)支持异步查询,因此您可以启动对池中每个连接的查询,然后定期轮询并在连接时触发更多查询可用。