多くの計算と条件を含む長く複雑なクエリがありますが、主な構造は次のようになります。
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 ║ メジャー 1 ║ メジャー 2 ║</p>
║ L2 メンバー ║ L1.FirstSet メンバー ║ L2-1 ║ L1-8 ║ 1 ║ 5 ║</p>
║ L2 メンバー ║ L1.FirstSet メンバー ║ L2-2 ║ L1-9 ║ 2 ║ 6 ║</p>
║ L2 メンバー ║ L1.SecondSet メンバー ║ L2-3 ║ L1-98 ║ 3 ║ 7 ║</p>
║ L2 メンバー ║ L1.SecondSet メンバー ║ L2-4 ║ L1-99 ║ 4 ║ 8 ║</p>
結果は正しいが、クエリは非常に遅い (>4 秒)。私の実際のクエリはより大きく、そのようなセットとメジャーが多数含まれているため、エンジンが内部最適化を実行できないようにする既存の関数と全体的な構造に問題があるようです。
この種の解決策は間違っていて醜いですが、どうすれば書き直して同じ結果をより速く得ることができますか?