Работа с многомерным кубом SSAS, который включает измерение UserGroups
, состоящее из нескольких иерархий. Каждая иерархия классифицирует пользователей как принадлежащих к определенной группе или нет. Пользователи могут принадлежать более чем к одной группе.
Попытка создать таблицу с одной строкой для каждой иерархии в измерении. Лучший подход, который я придумал, заключается в следующем:
WITH
MEMBER [Measures].[Group Name] AS
CASE
WHEN [UserGroups].[Group A].CurrentMember.MemberValue <> 'All' THEN "Group A"
WHEN [UserGroups].[Group B].CurrentMember.MemberValue <> 'All' THEN "Group B"
-- More user groups...
WHEN [UserGroups].[Group T].CurrentMember.MemberValue <> 'All' THEN "Group T"
ELSE "Error"
END
SELECT
{[Members].[Group Name], [Measures].[User Count], [Measures].[Revenue]} ON 0,
Order(
UNION(
[UserGroups].[Group A].&[True] *
{[UserGroups].[Group B].[All]} *
-- More user groups...
{[UserGroups].[Group T].[All]},
[UserGroups].[Group A].[All] *
{[UserGroups].[Group B].&[True]} *
-- More user groups...
{[UserGroups].[Group T].[All]},
-- A bunch more blocks so that there is one for each row.
[UserGroups].[Group A].[All] *
{[UserGroups].[Group B].[All]} *
-- More user groups...
{[UserGroups].[Group T].&[True]}
),
)
ON 1
FROM [Finances];
Это удается создать ожидаемую таблицу:
Group Name User Count Revenue
All All ... True Group T 90 1800
... ... ... ... ... ... ...
All True ... All Group B 20 400
True All ... All Group A 10 100
Однако запрос выполняется очень медленно. Любая заданная строка может быть вычислена изолированно примерно за 30 секунд. При объединении строк с помощью оператора UNION
каждая дополнительная строка приводит к экспоненциальному увеличению времени вычислений, а не к желаемому линейному увеличению времени вычислений.
- Почему наблюдается такое увеличение времени?
- Есть ли способ указать базовому движку вычислять каждую строку изолированно?
- Есть ли просто лучший способ выполнить этот запрос?