Путаница с индексированным представлением - PullRequest
1 голос
/ 09 февраля 2012

У меня есть следующее индексированное представление:

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 пропускает постоянные данные из индексированного представления и запрашивает базовую таблицу, на которой основано представление.

1 Ответ

5 голосов
/ 09 февраля 2012

Используете ли вы SQL Server Standard Edition? Если это так, вам нужно использовать подсказку 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...