Отдел индексированных представлений SQL Server
Можно ли выполнить деление в операторе SELECT индексированного представления? В тот момент, когда я добавляю результат столбца, который будет делиться на значение одного столбца, деленное на другой, я начинаю получать следующую ошибку:
Невозможно создать кластеризованный индекс "CX_t" для представления "MyDB.dbo.getUsageForUsers", поскольку список выбора представления содержит выражение для результата статистической функции или столбца группировки. Попробуйте удалить выражение из результата статистической функции или столбца группировки из списка выбора.
SUM(ISNULL(DATEDIFF(minute, ac.StartTime, ac.EndTime), 0)) AS Effort,
SUM(ISNULL(DATEDIFF(minute, ut.StartTime, ut.EndTime), 0)) AS Availability,
-- Below line leads to the error in the question
SUM(ISNULL(DATEDIFF(minute, ac.StartTime, ac.EndTime), 0)) / SUM(ISNULL(DATEDIFF(minute, ut.StartTime, ut.EndTime), 0)) AS Utilisation,
Спасибо
1 ответ
Как говорит ошибка, вы не можете создавать выражения, которые работают с результатами агрегатов. Что вы можете сделать, это создать два представления. Первое представление, индексированное, просто вычисляет агрегаты (Effort
а также Affordability
). Второе представление, не индексируемое, использует первое представление и может выполнять дальнейшие вычисления (Utilisation
) и используется при запросе кода.
Вы по-прежнему будете получать выгоду от индексов, поддерживающих агрегаты, что является дорогостоящей операцией, к которой часто обращаются индексированные представления.
CREATE VIEW dbo.V1
WITH SCHEMABINDING
AS
SELECT
SUM(ISNULL(DATEDIFF(minute, ac.StartTime, ac.EndTime), 0)) AS Effort,
SUM(ISNULL(DATEDIFF(minute, ut.StartTime, ut.EndTime), 0)) AS Availability,
...
CREATE INDEX IX_V1 on dbo.V1 (...)
CREATE VIEW dbo.V2
WITH SCHMEBINDING
AS
SELECT
Effort,
Availability,
Effort/Availability as Utilisation
/* Other calcs */
FROM
dbo.V1 WITH (NOEXPAND)