web-dev-qa-db-ja.com

同じディメンションからの異なる階層でのMDX Crossjoinフィルタリングは非常に遅い

非常に遅いMDX初心者によって作成されたMDXクエリがあります(クエリ、つまりMDX初心者ではありません)。また、私はMDX初心者でもあります。これがクエリです:

SELECT
NON EMPTY
(
    [Measures].[Status]
)
ON COLUMNS,
NON EMPTY
(
    Filter
    ( 
        Crossjoin
        (
            {
                [Value1].[Value1].[Value1A],
                [Value1].[Value1].[Value1B]
            },
            [Value2].[Value2A].[Value2A],
            [Value3].[Value3].[Value3].ALLMEMBERS,
            [Value4].[Value4].[Value4].ALLMEMBERS,
            [Value5].[Value5].[Value5],
            [Value2].[Value2B].[Value2C],
            [Value6].[Value6].[Value6],
            [Value7].[Value7A].[Value7A]
        ),
        (
            [Measures].[Status]
        ) > 0
    )
)
ON ROWS
FROM [Cube]
WHERE
(
    [Value7].[Value7].[Value7A],
    [Value8].[Value8].[Value8A],
    [Value9].[Value9].[Value9A]
)
CELL PROPERTIES VALUE

MDXについての知識はほとんどありませんが、試行錯誤の結果、Crossjoinから2つの[Value1].[Value1]エントリを削除すると、クエリがすばやく返されることがわかりました。または、[Value2].[Value2A][Value5]の両方のエントリを削除すると、すばやく戻ります。しかし、明らかに、これはクエリを変更するため、解決策ではありませんが、SQL Analysis Servicesにこのようなものがあれば、インデックスなどのどこで調べるべきかについての手掛かりを提供する可能性があります(私は、 SQL Serverデータベース)?

私が試した1つのことは、&[Value1A]の前に[Value1B]を置くことです。これにより、クエリが結果を返さずに非常に迅速に返されました。残念ながら、これが正しいかどうかはわかりません。この変更のないクエリでは、結果があるかどうかを確認するのに時間がかかりすぎるためです。 &がどのような違いをもたらすかはわかりませんが、これは明白な答えですか、それともクエリが異なるように変更されますか?同様に、このクエリの元の作成者が&を使用する必要があったとしても、実際のデータセットでクエリをテストすることはできませんでした。

どんな助けでも大歓迎です。

2
Neo

私は答えを見つけました here これは私の状況に役立ち、クエリは非常に迅速に返されます。データセットが適度に小さい限り、HAVING句はFilter関数を使用するよりも優れたソリューションであるようです。しかし、私はNON EMPTY 2番目の軸から(ON ROWS)を使用すると、HAVING句を使用しても速度が低下します。私もその問題を解決する必要があるかもしれません。しかし、少なくとも最初の問題は解決されています。

0
Neo

これを試して:

SELECT
    [Measures].[Status]
ON COLUMNS,
NONEMPTY
({
                [RiskType].[RiskType].[MemberValue123],
                [RiskType].[RiskType].[MemberValue456]
            }*
            [Trade].[TradeType].[TradeType]*
            [Expiry].[Expiry].[Expiry].ALLMEMBERS*
            [Tenor].[Tenor].[Tenor].ALLMEMBERS*
            [YieldCurveCurrency].[YieldCurveCurrency].[YieldCurveCurrency]*
            [Trade].[TradeBook].[XYZ1]*
            [Index].[Index].[Index]*
            [EffectiveStrike].[Effective Strike Name].[Effective Strike Name]
,
            [Measures].[Status]
)
ON ROWS
FROM [RePro]
WHERE
(
    [RiskSet].[RiskSet].[ABC],
    [Portfolio].[Portfolio].[XYZ],
    [RunDate].[RunDate].[17 Sep 2013]
)
0
user31779