今天看了《MDX Solutions with Microsoft SQL.Server Analysis Services 2005 and Hyperion Essbase 2nd Edition》书中关于优化SET操作的内容,并根据书中的内容作了一些测试,而测试结果有些符合书中的观点,有些则完全不同,真是让人有些意外。书中优化Set操作的主要观点是:

1. 优化Set操作的关键在于:把大的SET操作变成小的SET操作。
2. 由于CrossJoin代价(CPU、内存)巨大,所以最好用其他操作代替CrossJoin操作。

SUM中的CrossJoin
作者认为:要避免SUM一个包含多个CrossJoin的Set,你可以用其他的操作(比如嵌套SUM)进行替换。据此,我测试了一下
两组语句:

[MDX学习笔记之五]优化Set操作——SUM中的CrossJoinWITH MEMBER MEASURES.ABC AS 
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
Sum (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    CrossJoin (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Customer].[Customer Geography].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Customer].[Customer Geography].[State-Province]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        ),
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        Crossjoin (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Date].[Calendar].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Date].[Calendar].[Date]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            ),
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Product].[Product Categories].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Product].[Product Categories].[Product Name]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            )
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        )
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    )
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    ,[Measures].[Internet Sales Amount]-[Measures].[Internet Tax Amount]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
  )
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
SELECT MEASURES.ABC ON 0 ,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Customer].[Customer Geography].[Country].Members *  
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Date].[Calendar].[Calendar Year].MEMBERS * 
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Product].[Product Categories].[Category].MEMBERS
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
ON 1
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
FROM [Adventure Works]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoinWITH MEMBER MEASURES.ABC AS 
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
Sum (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        
[Customer].[Customer Geography].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        
[Customer].[Customer Geography].[State-Province]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    ),        
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    
SUM(
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Product].[Product Categories].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Product].[Product Categories].[Product Name]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        ),
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        
SUM(
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Date].[Calendar].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Date].[Calendar].[Date]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            )        
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            ,[Measures].[Internet Sales Amount]-[Measures].[Internet Tax Amount]

[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        )                
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    )    
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin)
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
SELECT MEASURES.ABC ON 0 ,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin{
[Customer].[Customer Geography].[Country].Members} *  
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Date].[Calendar].[Calendar Year].Members * 
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Product].[Product Categories].[Category].Members
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
ON 1
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
FROM [Adventure Works]

以上语句中,作者认为第一个语句慢于第二个语句(理由是嵌套的SUM每次操作的SET更小),可实际的结果(测了10次)恰恰相反,第一个语句平均花费的时间51.654秒,而第二个语句平均花费的时间在55.912秒,这是何故呢?此外,书中认为在第二个语句的嵌套SUM中,如果把大的Set放在里面,这样会快一些。也就是说下面的语句比上面第二个语句要慢5%-20%。

[MDX学习笔记之五]优化Set操作——SUM中的CrossJoinWITH MEMBER MEASURES.ABC AS 
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
Sum (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        
[Date].[Calendar].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        
[Date].[Calendar].[Date]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    ),
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    
SUM(
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Product].[Product Categories].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Product].[Product Categories].[Product Name]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        ),      
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        
SUM(
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Customer].[Customer Geography].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Customer].[Customer Geography].[State-Province]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        ),    
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Measures].[Internet Sales Amount]-[Measures].[Internet Tax Amount][MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        )                
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    )    
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin)
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
SELECT MEASURES.ABC ON 0 ,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin{
[Customer].[Customer Geography].[Country].Members} *  
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Date].[Calendar].[Calendar Year].Members * 
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Product].[Product Categories].[Category].Members
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
ON 1
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
FROM [Adventure Works]

以上测试语句中,关于[Date].[Calendar].[Date]的Set其Turple个数在365左右,关于[Product].[Product Categories].[Product Name]的Set其Turple个数在几十个左右,而关于[Customer].[Customer Geography].[State-Province]的Set其成员个数大多在十几个左右

经过测试发现上面这条语句平均时间在57.858秒。也就是说,测试结果和书中的观点是一致的,只是幅度没有那么大。此外,我还尝试了一下这样的写法。

[MDX学习笔记之五]优化Set操作——SUM中的CrossJoinWITH 
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoinMEMBER MEASURES.ABC 
AS 
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
Sum (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    CrossJoin (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Customer].[Customer Geography].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            
[Customer].[Customer Geography].[State-Province]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        ),
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        Crossjoin (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Date].[Calendar].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Date].[Calendar].[Date]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            ),
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            Descendants (
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Product].[Product Categories].CurrentMember,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin                
[Product].[Product Categories].[Product Name]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin            )
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin        )
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    ) 
AS MYABC
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    ,
[Measures].[Internet Sales Amount]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin)
-
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
Sum (    
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    MYABC
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin    ,
[Measures].[Internet Tax Amount]
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin)
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
SELECT MEASURES.ABC ON 0 ,
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Customer].[Customer Geography].[Country].Members *  
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Date].[Calendar].[Calendar Year].MEMBERS * 
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
[Product].[Product Categories].[Category].MEMBERS
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
ON 1
[MDX学习笔记之五]优化Set操作——SUM中的CrossJoin
FROM [Adventure Works]

上面语句的不同之处在于,把要计算的内容分散开来了,令人惊异的是,这个语句只要2-3秒种就能运行完成。


总结
由上面两次测试我们可以得出以下结论:
1)SUM中的CrossJoin并不一定会降低速度,书中的观点可能是错误的。看来MDX解析器对CrossJoin有很多有优化,在上面的测试中CrossJoin比嵌套的SUM要快8%左右。
2)嵌套SUM中,把大的SET放在里层的SUM中,这样速度能够快一些。上面的测试中,把小的Set放在里层比把大的Set放在里层慢3.5%。
3)在做SUM等统计计算时,如果能够把计算项分解到每个单独的Measure,这个时候性能提升非常明显,速度将会大大提高。上面的测试中,速度提高了20多倍。

相关文章:

  • 2022-01-09
  • 2021-09-17
  • 2021-08-30
  • 2022-01-11
  • 2021-11-29
  • 2022-01-20
  • 2022-12-23
猜你喜欢
  • 2021-07-04
  • 2021-10-06
  • 2021-07-09
  • 2021-06-19
  • 2021-12-25
相关资源
相似解决方案