У меня есть длинный сложный запрос с большим количеством расчетов и условий, но основная структура выглядит следующим образом:Быстрых динамический расчет именованного набора
WITH
MEMBER [Id1] AS [Level].[Level1].CurrentMember.Member_Key
MEMBER [Id2] AS [Level].[Level2].CurrentMember.Member_Key
MEMBER [Level].[Level1].[FirstSet] AS NULL
MEMBER [Level].[Level1].[SecondSet] AS NULL
SET [Set 1] AS {some processed set members}
SET [Set 2] AS {some other processed set members}
SET [Common CrossJoin Set] AS [Level].[Level2].Members
MEMBER [Calculated Measure 1] AS
IIF([Level].[Level].CurrentMember.Member_Key = 'FirstSet',
SUM(existing [Set 1]),
IIF([Level].[Level].CurrentMember.Member_Key = 'SecondSet',
SUM(existing [Set 2]),
SUM([Measures].[Measure1]) * 15
)
)
MEMBER [Calculated Measure 2] AS
IIF([Level].[Level].CurrentMember.Member_Key = 'FirstSet',
SUM(existing [Set 1]),
IIF([Level].[Level].CurrentMember.Member_Key = 'SecondSet',
SUM(existing [Set 2]),
SUM([Measures].[Measure2]) * 20
)
)
SELECT
{ [Id1], [Id2], [Calculated Measure 1], [Calculated Measure 2]} ON COLUMNS,
{ ([Common CrossJoin Set], [Level].[Level1].[FirstSet]),
([Common CrossJoin Set], [Level].[Level1].[SecondSet])
} ON ROWS
FROM [Cube]
Так в результате таблица выглядит следующим образом:
║ - ------------- ║ --------------------------- ║ Id1 ║ Id2 ║ Measure1 ║ Measure2 ║
║ L2 Член ║ L1.FirstSet член ║ ║ L2-1 L1-8 ║ 1 ║ ║ 5
║ ║ L2 член L1.FirstSet член ║ ║ L2-2 L1-9 ║ ║ 2 6 ║
║ ║ L2 член L1.SecondSet член ║ ║ L2-3 L1-98 ║ ║ 3 7 ║
║ Участник L2 ║ L1.SecondSet Member ║ L2-4 ║ L1-99 ║ 4 ║ 8 ║
Результат правильный, но запрос очень медленный (> 4сек). Мой фактический запрос больше и содержит множество таких наборов и мер, поэтому кажется, что проблема заключается в существующей функции и общей структуре, которая предотвращает выполнение внутренних оптимизаций.
Такое решение является неправильным и уродливым, но как я могу его переписать и получить тот же результат быстрее?
Вы можете заменить эти заявления '[уровень]. [Уровень] .CurrentMember .Member_Key = 'FirstSet'' для определенных членов, использующих оператор 'IS', например [Уровень]. [Уровень] .CurrentMember IS [Уровень]. [Уровень]. [Уровень]. [FirstSet] ' – whytheq
Какова цель этих NULL-заявлений? 'MEMBER [Level]. [Level1]. [FirstSet] AS NULL' – whytheq
Я попытался заменить оператор IS, но он не работает. Цель NULL-членов - просто создать пустую строку с определенным набором в ней для каждого члена в [Common CrossJoin Set] (или [Level]. [Level2] .Members). – VasiliyKapitanskiy