2017-12-18 158 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(因此大多數客戶端驅動程序)支持異步查詢,因此您可以啓動對池中每個連接的查詢,然後定期輪詢並在連接時觸發更多查詢可用。