簡體   English   中英

MDX查詢非常慢,並且在SSRS中返回內存異常

[英]MDX query is very slow and returns memory exception in SSRS

我正在嘗試從以下多維表達式(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中返回內存異常。 關於如何優化或增強它的任何想法?

您可以使用Having而不是Filter ,因為它是在Non Empty之后應用的,因此您可能會獲得更好的性能(請參閱Chris Webb撰寫的精彩博客文章 )。 這將是查詢的新版本:

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])

我建議進行一些更改。

首先,您是否真的要在查詢中返回每個維度的All成員? 如果符合過濾條件,它們將被包括在內。 另外,我發現將where子句更改為子選擇在某些情況下可以更好地執行。 您需要測試以查看它是否會改變性能。 接下來,可以通過將NonEmpty函數放入Filter函數中來首先減少要過濾的成員數。 而且,在某些情況下,使用多態運算符(*)的效果要比使用CrossJoin函數或創建成員的元組集的效果差。 當軸上只有一個項目時,列上的NON EMPTY是不必要的。 我在下面結合了所有這些建議:

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])

請參閱此以獲取有關NON EMPTY與NonEmpty的一些解釋: http : //blogs.msdn.com/b/karang/archive/2011/11/16/mdx-nonempty-vs-nonempty.aspx 在某些情況下,將NonEmpty函數放入Filter函數中可能會產生性能下降的情況,有時卻不會-您需要進行測試。

問題可能出在維度或多維數據集設計中(存儲引擎問題),而不是查詢中(公式引擎問題)。 您可以在此處使用這些技術進行診斷: http : //www.microsoft.com/zh-cn/download/details.aspx?id=661 該白皮書是針對SSAS 2005編寫的,但仍適用於SSAS的更高版本。

為了減少內存,請訂購尺寸。

代替:

[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成員,外部加入Loss Date成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM