Postgresql

如何將並行導入與 COPY 同步?

  • March 25, 2018

我有大約 20 個同時建構的表,但psql在第一階段使用不同的程序(通過 bash 腳本),例如:

create table foo_1 as (select ....); -- via psql process 1
create table foo_2 as (select ....); -- via psql process 2
create table foo_3 as (select ....); -- via psql process 3
...
create table foo_20 as (select ....); -- via psql process 20

一旦他們建成一個新的階段應該開始。有沒有什麼好的策略來協調這個多重建構?我的意思是,通過發現所有表都是從第 1 階段開始建構的,從而同步這兩個階段。

並行數據庫操作

有沒有什麼好的策略來協調這個多重建構?

好吧,執行需要多個數據庫連接的任務的正確方法是使用fork-execspawn在 Windows 上)。然後你在父母那裡等待孩子們回來。要獲得好評,請查看YouTube 上的此影片。它會在大約 27 分鐘內啟動 fork-exec。如果您是 Unix 新手,那麼整個影片可能正在觀看。

儘管您的負載並行速度要快得多,但它不太可能,因為 CPU 不太可能是瓶頸。

從文件載入

如果它確實很重要,並且您是從文件載入而不是查詢簽出pg_bulkload而不是自己執行此操作。

物化視圖

在您的情況下,您正在批量處理CREATE TABLE AS SELECT( CTAS)。CTAS 對測試數據很有用。如果您正在做的不是測試數據,並且您正在刪除這些表並重新創建它們或類似的東西,那麼我強烈建議您檢查的是MATERIALIZED VIEWS哪些甚至可以REFRESH MATERIALIZED VIEW CONCURRENTLY

REFRESH MATERIALIZED VIEW完全替換物化視圖的內容。舊內容被丟棄。

$$ … $$ CONCURRENTLY刷新物化視圖而不鎖定物化視圖上的並發選擇。如果沒有此選項,影響大量行的刷新將傾向於使用更少的資源並更快地完成,但可能會阻止嘗試從物化視圖讀取的其他連接。在少量行受到影響的情況下,此選項可能會更快。

引用自:https://dba.stackexchange.com/questions/202107