我是MDX的新手。我試圖在SSRS報告中運行以下MDX查詢,並且需要很長時間才能完成運行。有時我必須取消查詢,因爲它太慢了。使用聚合過濾器進行MDX查詢計算成員太慢
WITH
--All forms ordered ASC
SET [OrderedSet] AS
Order
(
NonEmpty
(
[Form].[Number].[Number]
,[Measures].[Sales]
)
,[Measures].[Sales]
,BASC
)
--Rank the forms in [orderedSet]
MEMBER [Measures].[Rank] AS
Rank
(
[Form].[Number].CurrentMember
,[OrderedSet]
)
--Running Total
MEMBER [Measures].[Running Total] AS
Sum
(
Head
(
[OrderedSet]
,(
[Measures].[Rank]
,[Form].[Number].CurrentMember
)
)
,[Measures].[Sales]
)
--Total Sales
MEMBER [Measures].[Total Sales] AS
Sum
(
[OrderedSet]
,[Measures].[Sales]
)
--Find the spending band Sales limits
MEMBER [Measures].[3%Sales] AS
0.03 * [Measures].[Total Sales]
MEMBER [Measures].[8%Sales] AS
0.08 * [Measures].[Total Sales]
MEMBER [Measures].[18%Sales] AS
0.18 * [Measures].[Total Sales]
MEMBER [Measures].[38%Sales] AS
0.38 * [Measures].[Total Sales]
MEMBER [Measures].[62%Sales] AS
0.62 * [Measures].[Total Sales]
MEMBER [Measures].[82%Sales] AS
0.82 * [Measures].[Total Sales]
MEMBER [Measures].[92%Sales] AS
0.92 * [Measures].[Total Sales]
MEMBER [Measures].[97%Sales] AS
0.97 * [Measures].[Total Sales]
--Assign Sales limits for each spending bands
MEMBER [Measures].[MinSales] AS
CASE
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[0-3]
THEN 1
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[3-8]
THEN
[Measures].[3%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[8-18]
THEN
[Measures].[8%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[18-38]
THEN
[Measures].[18%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[38-62]
THEN
[Measures].[38%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[62-82]
THEN
[Measures].[62%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[82-92]
THEN
[Measures].[82%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[92-97]
THEN
[Measures].[92%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[97-100]
THEN
[Measures].[97%Sales]
END
MEMBER [Measures].[MaxSales] AS
CASE
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[0-3]
THEN
[Measures].[3%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[3-8]
THEN
[Measures].[8%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[8-18]
THEN
[Measures].[18%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[18-38]
THEN
[Measures].[38%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[38-62]
THEN
[Measures].[62%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[62-82]
THEN
[Measures].[82%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[82-92]
THEN
[Measures].[92%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[92-97]
THEN
[Measures].[97%Sales]
WHEN
[Form].[Number].CurrentMember = [Form].[Number].[97-100]
THEN
[Measures].[Total Sales]
END
--Create Spending bands based on the Running Total ranges
MEMBER [Form].[Number].[0-3] AS
Aggregate
(
Filter
(
[OrderedSet]
,
[Measures].[Running Total] > 0
AND
[Measures].[Running Total] <= [Measures].[3%Sales]
)
)
MEMBER [Form].[Number].[3-8] AS
Aggregate
(
Filter
(
[OrderedSet]
,
[Measures].[Running Total] > [Measures].[3%Sales]
AND
[Measures].[Running Total] <= [Measures].[8%Sales]
)
)
MEMBER [Form].[Number].[8-18] AS
Aggregate
(
Filter
(
[OrderedSet]
,
[Measures].[Running Total] > [Measures].[8%Sales]
AND
[Measures].[Running Total] <= [Measures].[18%Sales]
)
)
MEMBER [Form].[Number].[18-38] AS
Aggregate
(
Filter
(
[OrderedSet]
,
[Measures].[Running Total] > [Measures].[18%Sales]
AND
[Measures].[Running Total] <= [Measures].[38%Sales]
)
)
MEMBER [Form].[Number].[38-62] AS
Aggregate
(
Filter
(
[OrderedSet]
,
[Measures].[Running Total] > [Measures].[38%Sales]
AND
[Measures].[Running Total] <= [Measures].[62%Sales]
)
)
MEMBER [Form].[Number].[62-82] AS
Aggregate
(
Filter
(
[OrderedSet]
,
[Measures].[Running Total] > [Measures].[62%Sales]
AND
[Measures].[Running Total] <= [Measures].[82%Sales]
)
)
MEMBER [Form].[Number].[82-92] AS
Aggregate
(
Filter
(
[OrderedSet]
,
[Measures].[Running Total] > [Measures].[82%Sales]
AND
[Measures].[Running Total] <= [Measures].[92%Sales]
)
)
MEMBER [Form].[Number].[92-97] AS
Aggregate
(
Filter
(
[OrderedSet]
,
[Measures].[Running Total] > [Measures].[92%Sales]
AND
[Measures].[Running Total] <= [Measures].[97%Sales]
)
)
MEMBER [Form].[Number].[97-100] AS
Aggregate
(
Filter
(
[OrderedSet]
,
[Measures].[Running Total] > [Measures].[97%Sales]
AND
[Measures].[Running Total] <= [Measures].[Total Sales]
)
)
SELECT
NON EMPTY
{
[Measures].[MinSales]
,[Measures].[MaxSales]
,[Measures].[Form Count]
,[Measures].[Sales]
} ON 0
,{
[Form].[Number].[0-3]
,[Form].[Number].[3-8]
,[Form].[Number].[8-18]
,[Form].[Number].[18-38]
,[Form].[Number].[38-62]
,[Form].[Number].[62-82]
,[Form].[Number].[82-92]
,[Form].[Number].[92-97]
,[Form].[Number].[97-100]
} ON 1
FROM
(
SELECT
[blah] ON COLUMNS
FROM [Cube]
);
經過幾次測試和谷歌搜索,我知道罪魁禍首是聚合過濾的表格編號的計算成員。另外[Form]。[Number]。[Number]維度是一個擁有數十萬成員的龐大維度。所以想知道我們是否在這樣一個維度上創建了一個計算成員,是否會減慢查詢速度,如果是的話,可以採取什麼措施?
非常感謝
感謝@whytheq – user2463061
@ user2463061我發現了另一個嚴重的問題 - 您應該始終在「WITH」條款中將成員放在正確的運行順序中。 – whytheq