2012-02-09 95 views
1

我有以下索引視圖:混淆索引視圖

ALTER View [CIC].[vwCoaterC473Heat] WITH SCHEMABINDING 
AS 

Select 
    id as ID, 
    DATEADD(ms, -DATEPART(ms, read_time), read_time) as ReadTime, 
    equipment_id as EquipmentID, 
    ... 
    ... 
From dbo.td_coater_c473_heat 
Where read_time >= Convert(dateTime,'1/1/2012',120) 

CREATE UNIQUE CLUSTERED INDEX [IX_vwCoaterC473Heat_ReadTime_EquipmentID_ID] 
ON [CIC].[vwCoaterC473Heat] 
(
    [ReadTime] ASC, 
    [EquipmentID] ASC, 
    [ID] ASC 
) 
GO 

而且我引用索引視圖以下查詢:

Select 
    r.Coater, 
    r.ReadTime, 
    C473_left_A_actual_Temp, 
    C473_right_A_actual_Temp, 
    C473_left_B_actual_Temp, 
    C473_right_B_actual_Temp, 
    HD02A_Actual_Voltage, 
    HD02A_Actual_Current, 
    HD02B_Actual_Voltage,  
    HD02B_Actual_Current 
From Cic.RandyTemp r 
    Inner Join Cic.vwCoaterC473Heat a 
    On a.EquipmentId = r.Coater And a.ReadTime = r.ReadTime 

從這個生成的查詢計劃如下所示:

enter image description here

我很好奇,爲什麼SQL Server是bypa從索引視圖中讀取持久數據,查詢視圖所依據的基礎表。

回答

5

您使用的是SQL Server標準版嗎?如果是這樣,你需要使用WITH (NOEXPAND)提示。請試試這個版本,看看是否使用了索引視圖。這可能只是優化器決定訪問基表中的索引更高效。

SELECT 
    r.Coater, 
    r.ReadTime, 
    C473_left_A_actual_Temp, -- why no alias prefixes from here down? 
    C473_right_A_actual_Temp, 
    C473_left_B_actual_Temp, 
    C473_right_B_actual_Temp, 
    HD02A_Actual_Voltage, 
    HD02A_Actual_Current, 
    HD02B_Actual_Voltage,  
    HD02B_Actual_Current 
FROM Cic.RandyTemp AS r 
    INNER JOIN Cic.vwCoaterC473Heat AS a WITH (NOEXPAND) 
    ON a.EquipmentId = r.Coater 
    AND a.ReadTime = r.ReadTime; 
+0

@AaronBetrand - 謝謝。 NOEXPAND工作。 – 2012-02-09 19:39:24