2014-12-02 3 views
3

Я выполняю вложенный SELECT для создания производной таблицы hourly, которая получает меня почасовые усреднения по доступности функции. Используя hourly, я усредняю ​​все эти значения для получения среднесуточного значения, и я хочу создать индексный вид дневных средних значений. Мой запрос выглядит следующим образом:Невозможно создать индексированный вид, потому что я ссылаюсь на производную таблицу

CREATE VIEW DailyView WITH SCHEMABINDING AS 
SELECT hourly.Feature, 
     AVG(hourly.AvgAvailability) AS AvgAvailability, 
     CAST(hourly.DateTime AS date) AS Date FROM 
     (SELECT DISTINCT 
         SC.Feature, 
         AVG(SA.Availability) AS AvgAvailability, 
         SA.DateAndHour AS DateTime 
     FROM dbo.ServiceAvailability AS SA LEFT OUTER JOIN 
       dbo.ServiceCatalog AS SC ON SA.ServiceID = SC.ServiceID 
GROUP BY SC.Feature, SA.DateAndHour) hourly 
GROUP BY hourly.Feature, CAST(hourly.DateTime AS date) 
GO 
CREATE UNIQUE CLUSTERED INDEX IDX_V1 ON DailyView(Date) 
GO 

Однако, я не могу создать индексированного представления таким образом, как я получаю следующее сообщение об ошибке:

Cannot create index on view "Reporting.dbo.DailyView" because it references derived table "hourly" (defined by SELECT statement in FROM clause). Consider removing the reference to the derived table or not indexing the view.

Это важно для меня индексировать эту точку зрения, как мы будем работа с большими объемами данных, но я не уверен, как получить вложенную среднюю таблицу без производной таблицы.

+2

Не могли бы вы создать представление * без * подзапроса и создать кластерный индекс на нем, а затем просто присоединиться к этому подзапросу, когда вам нужно? –

+2

Прежде чем вы начнете создавать индексированный просмотр, вы пробовали различные методы настройки производительности, такие как индексы, превращая 'CAST (hourly.DateTime AS date)' в расчетный столбец с индексом и т. Д. –

+0

Оба хороших предложения. Я посмотрю на них. – wemblem

ответ

1

Проблема не в подзапросе. Вы не можете использовать AVG в индексированном виде. Вместо этого используйте SUM и COUNT_Big, поэтому, когда вы запрашиваете это представление, вы можете рассчитать среднее значение. ЛЕВЫЕ СОЕДИНЕНИЯ не допускаются. Только INNER JOINs

Вы можете проверить, можете ли вы создать индексированный вид для производной таблицы после внесения изменений в сочетании с правильными индексами.

Смежные вопросы