Индексированные представления в OLTP?

Я знаком с индексированными представлениями SQL Server (или материализованными представлениями Oracle), мы используем их в наших приложениях OLAP. У них есть действительно крутая функция, позволяющая узурпировать план выполнения и переназначить его на индексированное представление без необходимости изменения существующего кода.

IE. Допустим, у меня был SPROC, который был очень дорогим соединением.

ВЫБЕРИТЕ [НЕКОТОРЫЕ КОЛОННЫ]
ИЗ Таблицы 1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица 2 [ДЕТАЛИ]
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица 3 [БОЛЬШЕ СОЕДИНЕНИЙ] ...

Если я создал индексированное представление, содержащее аналогичный набор результатов, оптимизатор запросов, скорее всего, отправит SPROC в мое индексированное представление, а не в базовые таблицы, и я получу значительное увеличение производительности.

Теперь предположим, что я хотел использовать индексированные представления в OLTP!? Я имею в виду, что большинство OLTP (таких как этот сайт) относительно тяжело читаются, если у них есть дорогие соединения, тогда мы могли бы ускорить их на тонну И потенциально уменьшить конфликт блокировки (http://www.codinghorror.com/blog/archives/001166.html ). Еще лучше то, что вам не придется менять какой-либо код, просто создайте индексированное представление.

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

Кто-нибудь когда-нибудь использовал индексированные представления для решения проблем, связанных с конфликтами или скоростью, в OLTP? Почему я никогда не видел, чтобы это использовалось?


person Tyler    schedule 11.09.2008    source источник


Ответы (2)


Материализованные представления могут быть полезны для создания отчетов по OLTP, особенно если для получения результатов агрегируется большое количество строк. Требования к пространству полностью зависят от того, сколько данных вы сохраняете. Думайте об этом как о кэше.

Сложный баланс заключается в том, насколько свежими должны быть данные для отчетов, и тем, какое влияние вы можете оказать на производительность OLTP. Если несколько устаревшие данные в порядке, вы можете запланировать обновления представлений в то время, когда активность системы низкая.

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

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

person Grant Johnson    schedule 07.10.2008
comment
Были ли эти материализованные представления созданы В OLTP или они хранились в другом месте? Если они были созданы в OLTP, как это повлияло на размер и производительность базы данных. Были ли какие-либо из этих OLTP под большой нагрузкой до того, как материализованные представления были записаны? - person Tyler; 11.09.2008
comment
Они были в OLTP. В основном потому, что пихать все по сети на DBLink было даже хуже, чем иметь их на OLTP. Использование становилось уродливым, и именно поэтому мы их построили. После того, как они оказались на месте, стало намного лучше. - person Grant Johnson; 13.10.2008

Мы используем материализованные представления, чтобы ускорить работу там, где я работаю. Чаще всего для отчетов по системе OLTP. Многие из наших отчетов запускаются из хранилища данных, но, поскольку мы обновляем хранилище в одночасье, до момента, когда данные должны поступать из таблиц OLTP.

person Joseph Bui    schedule 11.09.2008