ドキュメントによると:
マテリアライズドビューの同時選択をロックアウトせずに、マテリアライズドビューを同時に更新します。(...)
...その他のコンテンツ...
でも、このオプションを使用して一度に一つだけREFRESHは、任意のに対して実行可能 マテリアライズド・ビューは1。
私が持っていたそれをリフレッシュするマテリアライズド・ビューの最後のリフレッシュ時間を確認機能をして、60秒以上が経過した場合、それがでしょう。
しかし、2つの別々のプロセスから同時にマテリアライズドビューを更新しようとするとどうなりますか?彼らはキューに入れますか、それともエラーを上げますか?
MATERIALIZED VIEWが更新されていることを検出して、触れないようにする方法はありますか?
現在、私は(設定リフレッシュする前に、テーブルのレコードを移入するために頼ってきたrefreshing
しtrue
)、その後にそれを設定するfalse
プロセスが終了したとき。
EXECUTE 'INSERT INTO refresh_status (last_update, refreshing)
VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id;
EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view';
EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id;
その後、このプロシージャを呼び出すたびに、最新の値last_update
とそのrefreshing
値を確認します。refreshing
trueの場合、マテリアライズドビューを更新しようとしないでください。
EXECUTE 'SELECT
extract(epoch FROM now() - (last_update))::integer,
refreshing
FROM refresh_status
ORDER BY last_update DESC
LIMIT 1' INTO update_seconds_ago, refreshing;
IF(updated_seconds_ago > 60 AND refreshing = FALSE) THEN
-- the refresh block above
END IF;
ただし、更新フラグが同期的に更新されているかどうかはわかりません(つまり、更新が実際に完了するまで実際に待機しています)。
このアプローチは合理的ですか、ここで何か不足していますか?