#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-деревом индексированного представления. В отличие от некоторых распространенных заблуждений, запрос представления никогда не переоценивается явно для обслуживания, все обслуживание выполняется на основе построчной оценки по мере вставки / обновления / удаления строк. И вот почему некоторые агрегированные операции (например. Минимальные и максимальные значения) не поддерживаются в индексированных представлениях.