Oracle материализовал представление обновлений доступности данных

В приложении с материализованными представлениями Oracle мне интересно узнать о доступности данных во время обновления.

Я опишу потенциальный пример.

Создается материализованное представление, которое обновляется каждый час. Запрос выполняется в течение 1 минуты, чтобы обновить это представление. Тем временем ряд API использует это представление для извлечения данных и потенциально может записывать в базовую таблицу, если это имеет значение.

Мои вопросы следующие?

  1. Что происходит с запросами в течение этого 1-минутного обновления, они заблокированы? Они получают старую копию данных?
  2. То, что происходит с записями в базовые таблицы в это время, влияет на них каким-либо образом.
  3. Что если активный запрос поступает в 2:59:59 и выполняется в течение 30 секунд в материализованном представлении, блокирует ли это представление, и обновление не запускается до 3:00:29, или этот запрос прерывается и приостанавливается обновлением?

Если требуется какое-либо разъяснение, пожалуйста, дайте мне знать.

Спасибо!

1 ответ

Правила для того, что запросы данных видят в материализованном представлении, идентичны правилам, которые применяются к тому, что запросы данных видят в таблице, в которой происходят изменения. Эти правила обобщены в документации по согласованности многоверсионного чтения.

Я предполагаю, что вы делаете атомное обновление материализованного представления. Вы могли бы сделать неатомарное обновление, которое урезало бы материализованное представление перед обновлением, но это почти наверняка не то, что вы хотели бы в этом случае.

  1. Запросы будут видеть данные в том виде, в каком они существовали при запуске запроса (или когда транзакция началась, если сеанс находится в уровне изоляции сериализуемой транзакции). Таким образом, перед началом обновления будет отображаться согласованная картина данных.
  2. Считыватели не блокируют записи, так что это не повлияет на запись в базовую таблицу.
  3. Как и 1, запрос будет видеть непротиворечивую картину данных в том виде, в каком они существовали, когда запрос начал выполняться (или когда транзакция началась). Обновление будет выполняться одновременно только в отдельной области транзакции. Единственное влияние состоит в том, что запрос потенциально может быть немного медленнее, поскольку, вероятно, потребуется применить некоторое количество UNDO к текущим кэшированным блокам, чтобы вернуть данные в том виде, в каком они существовали на момент начала запроса.
Другие вопросы по тегам