Вопрос

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

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

ВЫБЕРИТЕ [НЕКОТОРЫЕ СТОЛБЦЫ]
ИЗ Таблицы 1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблицы 2 [ДЕТАЛИ]
Внутреннее соединение Таблица 3 [Банч больше соединений] ...

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top