SQL Server 2008 - 了解索引视图

时间:2011-11-08 16:05:32

标签: sql-server 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列为> = 11/4/2011的行,并且指定列上将存在聚簇索引?

1 个答案:

答案 0 :(得分:7)

'table'是一个逻辑概念,'table'没有存储概念。作为存储,SQL Server了解两种类型的存储:堆(一组无序行)或b树(一组有序行)。索引(群集或非群集)是b树,没有聚簇索引的“表”具有用于基本存储的堆。

根据视图定义和聚簇索引定义,创建索引视图会添加一个包含满足查询的行的新b树。此外,表上的所有操作也维护索引视图b-tree:表中的删除从索引视图b-tree中删除行,插入表中将行添加到索引视图b-tree中,更新表中的行会更新索引视图b-tree中的行。此维护可确保继续满足原始视图定义中的条件:仅添加与WHERE read_time>...条件匹配的行,将read_time修改为不再满足条件的值的更新将删除索引视图b-tree等的行。所有这些维护都是通过适当修改插入/更新/删除操作的查询执行计划来评估索引视图谓词并对索引视图b-tree进行适当的操作来完成的。与一些常见的误解状态不同,视图查询从不显式重新评估以进行维护,所有维护都是在插入/更新/删除行时逐行评估完成的。这就是索引视图中不支持某些聚合操作(例如MIN,MAX)的原因。