ПрограммированиеBackend разработчик

Что такое индексированный просмотр (Indexed View) в SQL, как он реализуется, для чего используется и какие есть подводные камни при его применении?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Индексированный просмотр (Indexed View, материализованное представление с индексом) — это представление (VIEW), для которого создан кластерный уникальный индекс. Это позволяет физически хранить результаты запроса на диске и использовать индекс для ускорения доступа.

Преимущества:

  • Быстрая выборка агрегированных или часто используемых данных.
  • Снимает нагрузку с вычислений в реальном времени.

Ограничения:

  • Не поддерживаются все типы запросов (например, нельзя использовать TEXT, NTEXT, IMAGE типы данных, некоторые функции).
  • Дополнительные издержки на поддержание индекса при изменениях в базовой таблице.
  • Требует соблюдения набора строгих правил при объявлении.

Пример кода

CREATE VIEW dbo.SalesSummary WITH SCHEMABINDING AS SELECT SalesPersonID, COUNT_BIG(*) AS SalesCount, SUM(TotalDue) AS TotalDue FROM dbo.Sales GROUP BY SalesPersonID; GO CREATE UNIQUE CLUSTERED INDEX idx_SalesSummary ON dbo.SalesSummary (SalesPersonID);

Вопрос с подвохом.

В: Все ли представления позволяют создать на себе индекс (кластерный)?

A: Нет, индексировать можно только такие VIEW, которые полностью отвечают ограничениям (например, нет внешних ссылок, агрегатные функции согласованы и др.). В противном случае запрос создания индекса выдаст ошибку.

Примеры реальных ошибок из-за незнания тонкостей темы.


История

На реальном проекте в банковской системе требовалось ускорить выборки по агрегированным отчетам. Создали индексированный VIEW без анализа нагрузки на обновление таблиц. При массовых операциях вставки производительность основной таблицы резко просела из-за значительных затрат на обновление индекса представления.


История

Специалист ошибочно полагал, что можно индексировать VIEW с указанным JOIN на внешнюю таблицу и функцию GETDATE(). Запрос создания индекса завершился с ошибкой "Cannot create index on view with non-deterministic functions". Был потрачен день на исправление проектной архитектуры.


История

В крупном e-commerce проекте обновление данных в базовой таблице "Products" стало причиной появившихся блокировок. Причина — некорректное управление транзакциями при наличии большого индексированного VIEW, в который агрегация затрагивала миллионы строк.