Выражение падений производительности в коррелированном подзапросе - PullRequest
0 голосов
/ 05 ноября 2019
SUM((CASE WHEN ([t2].[__measure__8] > 1) THEN (CASE WHEN [t2].[__measure__8] = 0 THEN NULL ELSE (CAST([t2].[__measure__9] as float) / [t2].[__measure__8]) END) ELSE [t2].[__measure__9] END))

, когда я использую этот расчет выше Correlated Subquery, у которого тоже есть группа. Получение набора результатов занимает более 5 минут. Более того, внутреннее подмножество запроса извлекается всего за 4 сек. Я что-то упускаю?

Как лучше написать это выражение?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Подставка выглядела как ненужная. Вы можете удалить CASE WHEN [t 2].[_ measure _8] = 0

SUM(CASE 
        WHEN ([t2].[__measure__8] > 1) THEN (CAST([t2].[__measure__9] as float) / [t2].[__measure__8]) 
        ELSE [t2].[__measure__9] 
    END )
0 голосов
/ 05 ноября 2019

Поскольку в вашем операторе case имеется только 1 условие, я предлагаю вместо этого использовать функцию iif.

sum(
    iif([t2].[__measure__8] > 1,
        iif([t2].[__measure__8] = 0, null, cast([t2].[__measure__9] as float)/[t2].[__measure__8]),
    [t2].[__measure__9])
)

Попробуйте разбить запрос с помощью subqueries, удалите sum() сначала проверьте улучшения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...