1

次の多次元式(MDX)クエリから、合計金額が100kを超えるすべてのレコードの詳細なリストを取得しようとしています。

with member [measures].[total] as 
[Measures].[m1] + [Measures].[m2] + [Measures].[m3]
select non empty
[measures].[total] on columns, 
non empty filter ([dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Loss Date].[Date].[Year].allmembers
* [Dim1].[h3].allmembers 
, [measures].[total]>100000 and [Measures].[Open File Count]>0) on rows
from [Monthly Summary]
where ([1 Date - Month End].[Month End Date].[Month].&[20120331])

ストアドプロシージャを作成すると高速な結果が得られ、最終結果は1000行未満ですが、MDXクエリはSSMSで永久に実行され、SSRSではメモリ例外が返されます。それを最適化または強化する方法について何かアイデアはありますか?

4

3 に答える 3

2

の後に適用すると、パフォーマンスが向上する可能性があるため、Havingの代わりに使用できます( Chris Webbによるこの優れたブログ投稿を参照してください)。これは、クエリの新しいバージョンになります。FilterNon Empty

with member [measures].[total] as 
[Measures].[m1] + [Measures].[m2] + [Measures].[m3]
select non empty
[measures].[total] on columns, 
non empty 
[dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Loss Date].[Date].[Year].allmembers
* [Dim1].[h3].allmembers 
having [measures].[total]>100000 and [Measures].[Open File Count]>0 on rows
from [Monthly Summary]
where ([1 Date - Month End].[Month End Date].[Month].&[20120331])
于 2012-08-21T06:59:43.040 に答える
2

いくつかの変更をお勧めします。

まず、各ディメンションのすべてのメンバーをクエリで返す必要がありますか?フィルタの条件を満たす場合に含まれます。また、場合によってはパフォーマンスを向上させるために、where句を副選択に変更することもわかりました。パフォーマンスが変化するかどうかをテストする必要があります。次に、最初にNonEmpty関数を使用して、フィルター関数内に配置することにより、フィルター処理するメンバーの数を減らすことができます。また、場合によっては、ポリモーフィック演算子(*)を使用すると、CrossJoin関数を使用したり、メンバーのタプルセットを作成したりするよりもパフォーマンスが低下します。軸にアイテムが1つしかない場合は、列の空でないことは不要です。これらの提案をすべて以下にまとめました。

with member [measures].[total] as 
[Measures].[m1] + [Measures].[m2] + [Measures].[m3]
select 
[measures].[total] on columns, 
filter (
   nonempty(
      ([dim1].[h1].[h1].members,
       [dim1].[h2].[h2].members,
       [Loss Date].[Date].[Year].members,
       [Dim1].[h3].[h3].members)
      , [measures].[m1]),
, [measures].[total]>100000 and [Measures].[Open File Count]>0) on rows
from
(select [1 Date - Month End].[Month End Date].[Month].&[20120331] on columns 
from [Monthly Summary])

NONEMPTYとNonEmptyの説明については、http://blogs.msdn.com/b/karang/archive/2011/11/16/mdx-nonempty-vs-nonempty.aspxを参照してください。場合によっては、NonEmpty関数をFilter関数内に配置すると、パフォーマンスが低下する可能性がありますが、そうでない場合もあります。テストする必要があります。

問題は、ディメンションまたはキューブの設計(ストレージエンジンの問題)にある可能性があり、クエリ(式エンジンの問題)にはない可能性があります。http://www.microsoft.com/en-us/download/details.aspx?id=661の手法を使用して診断できます。ホワイトペーパーはSSAS2005用に作成されましたが、それ以降のバージョンのSSASにも適用されます。

于 2012-08-21T13:19:31.983 に答える
1

メモリを減らすには、寸法を注文してください。

それ以外の:

[dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Loss Date].[Date].[Year].allmembers
* [Dim1].[h3].allmembers 

使用する

[dim1].[h1].allmembers
* [dim1].[h2].allmembers
* [Dim1].[h3].allmembers
* [Loss Date].[Date].[Year].allmembers 

裏で、SSASはdim1メンバーに内部結合し、LossDateメンバーに外部結合します。

于 2012-08-21T09:50:37.107 に答える