PostgreSQL中的分区表

问题描述 投票:2回答:2

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

    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个核心要使用,我想充分利用它,如何更改查询或创建一个函数来说明仅在同时运行的子集上运行删除功能。

sql postgresql
2个回答
0
投票

你还不能那样做。

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.