2014-11-22 2 views
4

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

На самом деле у нас есть общая система, которая материализует и обновляет представления каждые n минут. Стоимость обновления может быть высокой, и я стараюсь знать, можем ли мы знать, изменились ли базовые данные или нет.

Мы не используем материализованное представление, потому что полное обновление обрезает таблицу и быстро обновляет работу только на столе с первичным ключом.

Кэш результатов не может выполнять задание, потому что для этого у нас недостаточно памяти.

Так что я хочу знать, если мы могли бы иметь метод, чтобы знать, если лежащей в основе данных мнения изменился с момента последнего обновления

+1

Не могли бы вы разместить номер вашего представления? Вы имеете в виду, что вы вообще не хотите использовать материализованное представление? Или просто вместе с результатом кэширования? – poida

+0

Если вы хотите свернуть свое собственное сырое решение (не знаете, почему, хотя, если база данных имеет встроенную поддержку), вы можете обновить таблицу после того, как триггеры вставок в таблице будут отображаться на основе – poida

+0

. Можно ли предположить, что таблица не имеет первичного ключа? – Ben

ответ

1

Вы могли бы иметь таблицу флагов, который выглядит примерно так:

CREATE TABLE FlagTable 
    SourceTable varchar(30), 
    UpdateDate DATETIME, 
    Handled CHAR(1) DEFAULT 'N' 

Создайте триггер на базовых таблицах, где в INSERT, UPDATE или DELETE таблицы вы вставляете запись в FlagTable с именем базовой таблицы

Если вы хотите проверить обновление, просто выберите WHERE Обработано = 'N', обновить псевдо-vi ew, затем установите Handled = 'Y'

0

Это только эвристика, но, как часть вашей процедуры обновления вида, вы можете запросить и сохранить максимальное значение ora_rowscn и количество строк из исходной таблицы. Затем периодически проверяйте эти значения, чтобы увидеть, изменились ли некоторые из этих таблиц.

select MAX(ora_rowscn), COUNT(*) 
    into last_change_scn, last_change_length 
    from src_table; 

Если я не слишком неправильно, это был какой-либо вставки или обновления в таблице, MAX(ora_rowscn) изменится. И если бы было какое-то удаление, то изменилось бы COUNT(*).

На темной стороне запрос MAX(ora_rowscn) вызовет полное сканирование таблицы. И, конечно же, это не может сказать вам, будут ли эти изменения повлиять или не повлиять на представление.

1

Вы можете сделать все это проще, установив параметр mat_view с обновлением на опции commit и, если возможно, также чтобы он обновил быстро на фиксации. Это гарантирует, что каждый раз, когда происходит изменение, представление обновляет только новые строки (по сравнению с полным обновлением, где запрос за представлением выполняется в целом).

Теперь этот последний метод может вызвать массу проблем, потому что параметр refresh fast on commit имеет ограничения, и если вы не можете выполнить его, вы просто не сможете его использовать. Если вы, однако, можете установить это на , то обновите завершение на commit, это может замедлить работу системы, как вы предполагали, время от времени, а также предполагает, что вы не можете изолировать источник изменений.

Если вы хотите увидеть, где происходит наиболее частая смена, я предлагаю вам использовать пользовательскую таблицу (в день), где будет храниться ежедневный результат запроса позади mat_view.Затем через несколько дней, просто сделать что-то вроде:

как метод с ORA_ROWSCN не всегда работает. Метод с триггерами работает в ограниченных случаях, и если не требуется создавать эти триггеры как 100 таблиц ... это смехотворно.

Когда вы находите источник изменений - например, несколько столбцов, исходящих из некоторых таблиц, то вы можете рассмотреть возможность перезаписи запроса mat_view, следуя некоторым принципам DW и создать звездную схему запроса. Это будет сегментировать запрос и, несомненно, ускорит запрос. Проверьте, откуда идет загрузка - если эти дорогостоящие соединения, сканирование того, чего нельзя избежать, возможно, разбивка запроса на более мелкие запросы может сделать трюк, если вы также можете материализовать их, возможно, вы можете быстро установить их с помощью обновления совершить также.

Все зависит от реализации. Если вы можете привести здесь пример запроса или его часть, с планом объяснения мы также можем дать вам конкретные решения.

ура

+0

Здравствуйте, g00dy, Спасибо за ваше объяснение. Это очень ясно. К сожалению, это не соответствует моей проблеме. У нас очень общая система, и иногда матовый вид с быстрым обновлением может ответить на нашу проблему, а иногда и нет. Каждый пользователь может запросить новое представление в нашей системе, и мы не контролируем их. Поэтому мы не можем использовать материализованное представление для его разрешения. – eliatou

Смежные вопросы