Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance SSAS-MDX查询性能问题_Performance_Sql Server 2008_Ssas_Mdx - Fatal编程技术网

Performance SSAS-MDX查询性能问题

Performance SSAS-MDX查询性能问题,performance,sql-server-2008,ssas,mdx,Performance,Sql Server 2008,Ssas,Mdx,我有一个MDX查询,它引用了SQL Server Analysis Services 2008 R2 Enterprise Edition多维数据集,从功能角度来看,该多维数据集可以准确、正确地返回所需的数据。然而,执行此查询需要5-10分钟,这对于在SSRS报告中执行此查询的最终用户来说是不可接受的 查询如下: With Member [Measures].[CurrentPaidAmount] as Sum ( Tail(nonempty(descendants([Valuat

我有一个MDX查询,它引用了SQL Server Analysis Services 2008 R2 Enterprise Edition多维数据集,从功能角度来看,该多维数据集可以准确、正确地返回所需的数据。然而,执行此查询需要5-10分钟,这对于在SSRS报告中执行此查询的最终用户来说是不可接受的

查询如下:

With Member [Measures].[CurrentPaidAmount] as 
Sum ( 
     Tail(nonempty(descendants([Valuation Date].[DateHierachy].currentmember,4),[Measures].[SaleCount]),1),
[Measures].[CurrentTotalPaidAmt] 
    ) 
Member [Measures].[PreviousPeriodPaidAmount] as 
Sum ( 
     Tail(descendants([Valuation Date].[DateHierachy].currentmember.prevmember,4),1), 
     [Measures].[CurrentTotalPaidAmt] 
     ) 
Member [Measures].[YTDCurrentPaidAmount] as 
([Measures].[CurrentPaidAmount] - [Measures].[PreviousPeriodPaidAmount]) 
select non empty 
    ( {[Valuation Date].[DateHierachy].[Year]}, {[Valuation Date].[Year].children}, 
      {[Valuation Date].[Month].[All]}, {[DimLocation].[State].[All]}, 
      {[DimSeller].[Store].children}, {[DimProduct].[ProductCode].children}, 
      {[DimProgram].[ProgramLine].children ) on rows, 
 [Measures].[YTDCurrentPaidAmount] on columns 
from 
    [CB_Sales]
此基础事实表以累积方式存储[支付总额]度量值,即在每月的最后一天,计算自时间开始以来为特定产品支付的总美元。这意味着在每个月底,该月的总已付美元将添加到前一个月的金额中,以便创建自时间开始以来相关产品的所有已付美元的总和

我的要求是计算每种产品每一年的总支付金额

考虑以下示例数据集,其中列出了特定产品当月迄今为止的总支付金额:

2010年12月产品A:$25.00

2011年11月-产品A:$50.00

2011年12月-产品A:$100.00

2012年1月-产品A:$150.00

2012年2月-产品A:$160.00

2012年3月-产品A:$200.00

如果我想获得上述产品A在2011日历年单独支付的总金额,我将获得截至2010年12月的产品A截至目前为止的总日历支付金额,即25.00美元,并从截至2011年12月的总支付金额中减去该金额,即100.00美元

减去这两个值会产生75.00美元的差异:

$100.00-$25.00=$75.00

这表明仅在2011日历年内就产品a支付了75.00美元

说到这里,回到上面的MDX查询,我已经创建了两个计算成员来执行这个计算

成员1:

[措施][CurrentPaidAmount]

此计算成员根据[Valuation Date].[DateHierachy].[year]属性的currentmember获取当前日历年记录的最后一个非空的已支付美元总额。对于当前2012日历年,记录总美元的最后一个月是2012年6月,计算成员需要足够聪明,以确定日期层次结构中的[June]2012月成员是应提取总支付美元的特定月份

我必须返回相关日期维度的[Year]属性,因为他们希望该成员显示在表格报告中

因此,我在计算的度量值中包含了以下集合,该集合将根据resultset中返回给客户的内容获取当前年份的值,并向下导航日期层次结构,直到我得到所述日历年中具有有效支付总额的最后一天,如下所示:

Tail(nonempty(descendants([Valuation Date].[DateHierachy].currentmember,4),[Measures].[SaleCount]),1),
我的推理是,如果用户选择连接报告中的所有年份,对于每一年,该特定计算成员将获得所述日历年最后一次非空的总美元支付金额,并允许我从上一年中减去该金额,以获得仅在所述日历年内发生的总美元支付金额

现在,我上面列出的完整MDX查询在执行时确实返回了正确的数据。执行需要很长时间,但执行需要5-10分钟以上。基础事实表包含6400万条记录

奇怪的是,如果我像这样从第一个计算成员的集合中删除nonempty子句,修改后的查询只需30秒即可执行:

With Member [Measures].[CurrentPaidAmount] as 
Sum (
      Tail(descendants([Valuation Date].[DateHierachy].currentmember,4),1), [Measures].[CurrentTotalPaidAmt] 
    )
我只能假设NoneEmpty子句正在阻碍查询的性能,因为计算成员需要计算date成员与[Measures].[SaleCount]度量的每个交集

我有没有办法重写上面的查询以更好、更快、更高效地执行,最好是在30秒之内而不是几分钟之内

我将默认聚合应用于多维数据集,并将其划分为多个多维数据集分区

我是MDX的新手,因此我非常感谢您的建议


谢谢你抽出时间

如果您的事实表可以存储非累积支付金额,您将直接拥有[Measures].[YTDCurrentPaidAmount],这样可以避免计算[Measures].[CurrentPaidAmount]和[Measures].[PreviousPeriodiumPaidaMount]。

如果您的事实表可以存储非累积支付金额,您将直接拥有[Measures]。[YTDCurrentPaidAmount]和[Measures].[CurrentPaidAmount]和[Measures].[PreviousPeriodicPAIDAMOUNT]的计算将被避免。

如果您混合使用现有的:

他变了

COUNT(NONEMPTY(
NONEMPTY(
EXISTING [Customer].[Customer].[Customer].MEMBERS
, [Measures].[Internet Sales Amount])
, ([Measures].[Internet Sales Amount], [Date].[Calendar].CURRENTMEMBER.PREVMEMBER))
)

速度提高了八倍

< p> 在日期维度上遇到这种情况似乎很奇怪——通常没有多少日期,至少与其他维度(例如客户或产品)相比是如此。你的约会维度有多长,你是否会不必要地远离未来或过去

您可以研究基于使用情况的优化,设置SSAS服务器属性,将MDX调用记录到指定的数据库,然后运行向导以基于此创建一组聚合。然后将聚合分配给分区,并处理索引(如果我没记错的话)


如果您加入现有产品,您有时可以获得对NoneEmpty的提升:

他变了

COUNT(NONEMPTY(
NONEMPTY(
EXISTING [Customer].[Customer].[Customer].MEMBERS
, [Measures].[Internet Sales Amount])
, ([Measures].[Internet Sales Amount], [Date].[Calendar].CURRENTMEMBER.PREVMEMBER))
)

速度提高了八倍

在日期维度上遇到这种情况似乎很奇怪——通常没有多少日期,至少与其他维度(例如客户或产品)相比是如此。你的约会维度有多长,你是否会不必要地远离未来或过去

您可以研究基于使用情况的优化,设置SSAS服务器属性,将MDX调用记录到指定的数据库,然后运行向导以基于此创建一组聚合。然后将聚合分配给分区,并处理索引(如果我没记错的话)


我是MDX的绝对新手,但在试图解决我自己在删除NON-EMPTY子句时关于性能问题的问题时,我遇到了一个潜在的解决方案。您可以尝试在计算成员的基本信息窗格中设置非空行为?? 问候


Carl

我是MDX的绝对新手,但在尝试解决我自己在删除非空子句时遇到的性能问题时,遇到了一个潜在的解决方案。您可以尝试在计算成员的基本信息窗格中设置非空行为?? 问候

卡尔