I have a table with billion rows each containing edges(geometries), some of which are duplicates and I'm using the following queries to delete the duplicated edges.
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
);
However, I have 8 cores to use and I want to make full use of it, How do I change the query or create a function to say run deletion function on subsets only running concurrently.
答案 0 :(得分:0)
你还不能那样做。
您可以并行运行其中几个查询。
如果您决定并行运行8,请将AND e1.id % 8 = 0
添加到第一个,AND e1.id % 8 = 1
添加到第二个,依此类推。
查询速度不会线性缩放。如果幸运的话,查询可以共享相同的顺序扫描,但很可能是您的I / O系统成为瓶颈。
答案 1 :(得分:0)
我在这些情况下通常做的是创建一个脚本,将密钥空间划分为连续的块,并将查询分配给连接池中的连接。
这比模数更好,因为在密钥空间中彼此靠近的元组可能位于相同的页面中(如果这是一个插入繁重的工作负载)很有可能,因此最小化核心之间的等待和传输缓冲区。
如果你采用这种方法,请注意libpq(以及大多数客户端驱动程序)支持异步查询,因此您可以启动对池中每个连接的查询,然后定期轮询,并在连接时触发更多查询可用。