Согласно документам:
В то же время Обновите материализованное представление, не блокируя параллельные выборки в материализованном представлении. (...)
... ДРУГОЕ СОДЕРЖАНИЕ ...
Даже с этой опцией только один REFRESH одновременно может работать с любым материализованным представлением .
У меня была функция, которая проверяла время последнего обновления для МАТЕРИАЛИЗИРОВАННОГО ВИДА и, если прошло более 60 секунд, оно обновило бы его.
Однако что произойдет, если я попытаюсь обновить материализованное представление из двух отдельных процессов одновременно? Будут ли они в очереди или они вызовут ошибку?
Есть ли способ определить, когда обновляется МАТЕРИАЛИЗИРОВАННЫЙ ВИД, и, следовательно, избегать его касания?
В настоящее время я прибегал , чтобы заполнить запись таблицы перед обновлением (настройка 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
это правда, то не пытайтесь обновить материализованное представление.
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;
Тем не менее, я не уверен, что флаг обновления обновляется синхронно (я имею в виду, что он действительно ожидает завершения обновления)
Это рациональный подход или я что-то здесь упускаю?