2011-11-08 148 views
2

我想嘗試瞭解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的行,並且聚集索引將存在於指示的列上?

回答

7

'表'是一個邏輯概念,'表'沒有存儲概念。作爲存儲,SQL Server理解兩種類型的存儲:堆(一組無序的行)或b樹(一組有序的行)。索引(聚簇或非聚簇)是b樹,沒有聚簇索引的「表」具有用於基礎存儲的堆。

根據視圖定義和聚簇索引定義,創建索引視圖會添加一個新的b-tree,其中包含滿足查詢的行。此外,表上的所有操作也維護索引視圖b-tree:表中的刪除從索引視圖b-tree中刪除行,向表中插入行將索引視圖添加到b-樹中,表中的一行更新會更新索引視圖b-tree中的一行。此維護保證原始視圖定義中的條件繼續得到滿足:僅添加與WHERE read_time>...條件匹配的行,將read_time修改爲不再滿足條件的值的更新將從索引視圖中刪除該行b-樹等等。所有這些維護都是通過適當地修改插入/更新/刪除操作的查詢執行計劃來完成的,以評估索引視圖謂詞並對索引視圖b-tree執行適當的操作。與一些常見的誤解狀態不同,視圖查詢是從不爲顯式重新評估維護,所有維護都是在行正在插入/更新/刪除時逐行評估的基礎上完成的。這就是爲什麼某些集合操作(​​如MIN,MAX)在索引視圖中不受支持的原因。