2016-07-06 50 views
1

我有一個物化視圖,它依賴於其他幾個物化視圖。postgresql 9.5 - 當父母同時刷新時鎖定子物化視圖

matviewA matviewB matviewC 
    \  |  /
     matviewX 

我想要做的是同時刷新父物化視圖同時全部。 (這不是一個真正的問題,如下所示。)[在我目前的環境中,每位家長都需要大約一個小時才能刷新。 ]

psql -c "refresh materialized view concurrently matviewA" & 
psql -c "refresh materialized view concurrently matviewB" & 
psql -c "refresh materialized view concurrently matviewC" & 

但是如果我開球上了孩子刷新:

psql -c "refresh materialized view concurrently matviewX" & 

它運行的時候了,並不會等待家長來完成清爽的,因爲他們不從鎖定自己的孩子在他們自己已經同時刷新的同時進行刷新。

我試圖把鎖的孩子,而父母正在運行:

psql -c "lock matviewX in share mode; refresh materialized view concurrently matviewA" & 
psql -c "lock matviewX in share mode; refresh materialized view concurrently matviewB" & 
psql -c "lock matviewX in share mode; refresh materialized view concurrently matviewC" & 

不幸的是,你不能把明確的鎖的物化視圖。

如果我不在父母身上「同時」使用,那麼孩子物化視圖變得不可讀。 (但是在運行之前,子刷新還是等待)。

我可以在調用「psql -c」的(bash)包裝腳本中編寫一些鎖管理。或者我可以使用更復雜的第三方作業調度程序。我希望有一個更簡單的方法。

我可能能夠編寫一個函數並將所有刷新放入該函數,然後使用臨時表進行手動顯式鎖管理。

或者可能使用諮詢鎖。

對此提出建議?

回答

1

你可以簡單地使用wait(見https://stackoverflow.com/a/18663969/3886053):

for parent in matviewA matviewB matviewC; do 
    psql -c "refresh materialized view concurrently $parent" & 
    echo "Started refreshing materialized view $parent" 
done 
echo -n "Waiting for all parents to finish... " 
wait 
echo "finished. Refreshing now the child materialized view" 
psql -c "refresh materialized view concurrently matviewX" 
+0

啊哈!這個伎倆,謝謝! – rotten