SQL Server 2008 — Понимание индексированных представлений

#sql-server #sql-server-2008

#sql-сервер #sql-сервер-2008 #sql-server-2008

Вопрос:

Я хочу попытаться понять, что делает SQL Server 2008 при создании индексированного представления.

Допустим, у меня есть следующее:

 CREATE View [vwCoaterC48] WITH SCHEMABINDING
AS

Select
    ID,
    equipment_id as EquipmentId,
    read_time as ReadTime,
    C48_R_Act_Temperature,
    C48_L_Act_Temperature,
    C48_C_Act_Temperature
From dbo.td_coater_c48 c
Where read_time >= Convert(dateTime,'11/4/2011',120)

CREATE UNIQUE CLUSTERED INDEX [IX_vwCoaterC48_ReadTime_EquipmentID_ID] ON [vwCoaterC48] 
(
    [ReadTime] ASC,
    [EquipmentId] ASC,
    [ID] ASC
)
  

Правильно ли я понимаю, что SQL Server создаст для этого какое-то физическое хранилище (таблицу?, что?). Физическое хранилище, или таблица, будет содержать только строки, где столбец read_time равен > = 4.11.2011, и кластеризованный индекс будет существовать в указанных столбцах?

Ответ №1:

«Таблица» — это логическая концепция, для «таблицы» не существует концепции хранения. В качестве хранилища SQL Server понимает два типа хранилища: кучу (набор неупорядоченных строк) или b-дерево (упорядоченный набор строк). Индекс (кластеризованный или некластеризованный) представляет собой b-дерево, «таблица» без кластеризованного индекса имеет кучу для базового хранилища.

При создании индексированного представления добавляется новое b-дерево, содержащее строки, которые удовлетворили запросу, в соответствии с определением представления и кластеризованным определением индекса. Кроме того, все операции над таблицей также поддерживают индексированное b-дерево представления: удаление в таблице удаляет строку из индексированного b-дерева представления, вставка в таблицу добавляет строку в индексированное b-дерево представления, обновление строки в таблице обновляет строку в индексированном b-дереве представления. Это обслуживание гарантирует, что условие в исходном определении представления продолжает выполняться: добавляются только строки, соответствующие WHERE read_time>... условию, обновление, изменяющее read_time значение, которое больше не удовлетворяет условию, удалит строку из b-дерева индексированного представления и т.д. И т.п. Все это обслуживание выполняется путем соответствующего изменения планов выполнения запросов для операций вставки / обновления / удаления, чтобы оценить предикат индексированного представления и выполнить соответствующую операцию над b-деревом индексированного представления. В отличие от некоторых распространенных заблуждений, запрос представления никогда не переоценивается явно для обслуживания, все обслуживание выполняется на основе построчной оценки по мере вставки / обновления / удаления строк. И вот почему некоторые агрегированные операции (например. Минимальные и максимальные значения) не поддерживаются в индексированных представлениях.