2010-02-09 5 views
3

У меня есть требование создать отчет, который убивает процессор и занимает много времени для запуска.SQL Server Indexed View Question

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

Индексированное представление потенциально содержит 5 миллионов записей, я не могу найти никаких указаний относительно того, в какой точке индексированные представления больше не рекомендуются. Я предполагаю, что индексный указатель такого размера займет много времени, чтобы построить, когда SQL начнет сначала, но я надеюсь, что после этого стоимость его поддержания будет минимальной.

Есть ли какие-либо рекомендации по лучшей практике относительно того, когда следует использовать представления индексов и когда их не использовать? Будет ли просмотр перестраиваться после перезапуска каждого сервера или он будет храниться где-нибудь на диске?

+0

Опубликовать медленные SQL и таблицы defs – TFD

ответ

2

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

Большое количество обновлений, скорее всего, убьет выгоду. Если он в основном читается, он будет работать нормально.

Настоящие преимущества индексированных представлений - это когда у вас есть агрегаты, которые слишком дороги для вычисления в реальном времени.

Пожалуйста, см: Improving Performance with SQL Server 2008 Indexed Views:

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

  • Скопление может быть предварительно вычислено и сохранено в индексе, чтобы минимизировать дорогих вычислений в процессе запроса выполнение.
  • Таблицы могут быть предварительно объединены и результирующий набор данных сохранен.
  • Сочетания объединений или агрегатов могут храниться.

Оптимизатор рассматривает индексируется только просмотров для запросов с нетривиальным стоимости. Это позволяет избежать ситуаций, когда пытается сопоставить различные индексированные представления во время оптимизации оптимизации запроса больше, чем экономия, достигаемая при использовании индексированного представления . Индексированные представления: редко используются в запросах со стоимостью менее 1.

Приложения, которые извлекают выгоду из реализации индексированных представлений включают:

  • рабочих нагрузок поддержки принятия решений.
  • Данные витрины.
  • Хранилища данных.
  • Магазины и источники информации для онлайн-аналитической обработки (OLAP).
  • Рабочие нагрузки для интеллектуального анализа данных.

С точкой типа запросов и шаблоном зрения, пользующиеся приложения можно охарактеризовать как те, содержащие:

  • Соединения и скопление больших таблиц.
  • Повторяющиеся шаблоны запросов.
  • Повторные агрегации на одинаковых или перекрывающихся наборах столбцов.
  • Повторяющиеся соединения одних и тех же таблиц на тех же клавишах.
  • Комбинации выше.
0

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

Что касается вашего вопроса о создании индекса - он хранится на диске, как и любой другой индекс, поэтому он не восстанавливается при перезагрузке сервера (кроме любого ремонта, который происходит из-за отсутствия транзакций завершено до перезапуска).

1

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

Для вашей проблемы, лучшим решением было бы запустить запрос и сохранить его в своей таблице, как:

select * into CachedReport from YourView 

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

+1

Выполнение этого на 5 000 000+ записей - плохая идея. –

+1

Почему это плохая идея? Я использовал этот метод на гораздо больших таблицах (100M + rows), и он работает очень хорошо. Это, безусловно, лучше, чем перестроение индексированного представления в 5 000 000 строк при обновлении базовой таблицы :) – Andomar

+0

В этом случае данные должны быть в режиме реального времени, поэтому я думаю, что индексный указатель - это способ пойти – Gavin

0

Нет ограничений на количество строк, когда следует использовать таблицу или материализованное представление. Однако в качестве ориентира избегайте материализованного представления по летучим таблицам - нагрузка может убить ваш сервер.

Прежде всего, поскольку Тимоти предложил проверить индексы на ваших базовых таблицах, а затем статистику. Оптимизатор запросов может находиться на полном пути из-за отсутствия/устаревшей статистики.

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