MDX クエリがあり、Mondrian エンジンで実行しています。
WITH
MEMBER [Measures].[HC Threshold] AS
Val(StrToMember("[HC Threshold].[HC Threshold].[All].[25000]").Name)
,FORMAT_STRING = "$#,0"
SET ClaimantsSet AS
Order
(
Filter
(
NonEmpty
(
[Count Of Claimants].[Count Of Claimants].[ID].MEMBERS
,{[Measures].[Plan Paid]}
)
,
[Measures].[Plan Paid] > [Measures].[HC Threshold]
)
,[Measures].[Plan Paid]
,desc
)
MEMBER [Measures].[ICD9Desc] AS
Tail
(
Order
(
NonEmpty
(
[ICD-9 Primary Diagnosis Code].[Diagnosis Code].[ID].MEMBERS
,{[Measures].[Plan Paid]}
)
,[Measures].[Plan Paid]
,asc
)
).Item(0).Item(0).Properties("Short Description")
SELECT
{[Measures].[ICD9Desc]} ON 0
,NON EMPTY
{ClaimantsSet} ON 1
FROM [Combined Claims]
WHERE
(
[Insights Group Structure].[Insights Group Structure].[Insights Report ID].&[1706].FirstChild
/* StrToMember("No HRA",CONSTRAINED), */
,[Plan Period].[Plan Period].[Date Year Quart].&[20152].Lead(4)
,[Claim Status].[Claim Status].[Claim Status ID].&[1]
);
実行すると、タイムアウトのために失敗します。
しかし、私が実行すると、
WITH
MEMBER [Measures].[HC Threshold] AS
Val(StrToMember("[HC Threshold].[HC Threshold].[All].[25000]").Name)
,FORMAT_STRING = "$#,0"
SET ClaimantsSet AS
Order
(
Filter
(
NonEmpty
(
[Count Of Claimants].[Count Of Claimants].[ID].MEMBERS
,{[Measures].[Plan Paid]}
)
,
[Measures].[Plan Paid] > [Measures].[HC Threshold]
)
,[Measures].[Plan Paid]
,desc
)
SELECT
NON EMPTY
{ClaimantsSet} ON 0
FROM [Combined Claims]
WHERE
(
[Insights Group Structure].[Insights Group Structure].[Insights Report ID].&[1706].FirstChild
/* StrToMember("No HRA",CONSTRAINED), */
,[Plan Period].[Plan Period].[Date Year Quart].&[20152].Lead(4)
,[Claim Status].[Claim Status].[Claim Status ID].&[1]
);
カラムにセットするだけで、3 分で正常に実行されます。
最初のクエリの SQL ログを調べたところ、セット「ClaimantSet」のタプルごとに ICD9Desc 値が計算されていることがわかりました。つまり、セット claimantSet に 300 タプルがある場合、ICD9Desc は 300 回計算され、300 SQL クエリ発生しています。そして、このため、時間とタイムアウトがかかります。
SQL クエリが何度も生成されないようにする解決策はありますか? Mondrian で MDX クエリまたはスキーマを最適化できますか?