Partition table in PostgreSQL

时间:2017-12-18 06:18:47

标签: sql postgresql

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.

2 个答案:

答案 0 :(得分:0)

你还不能那样做。

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

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

答案 1 :(得分:0)

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

这比模数更好,因为在密钥空间中彼此靠近的元组可能位于相同的页面中(如果这是一个插入繁重的工作负载)很有可能,因此最小化核心之间的等待和传输缓冲区。

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