Отдел индексированных представлений 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)
Другие вопросы по тегам