Performance SSAS-MDX查询性能问题
我有一个MDX查询,它引用了SQL Server Analysis Services 2008 R2 Enterprise Edition多维数据集,从功能角度来看,该多维数据集可以准确、正确地返回所需的数据。然而,执行此查询需要5-10分钟,这对于在SSRS报告中执行此查询的最终用户来说是不可接受的 查询如下: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
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的绝对新手,但在尝试解决我自己在删除非空子句时遇到的性能问题时,遇到了一个潜在的解决方案。您可以尝试在计算成员的基本信息窗格中设置非空行为?? 问候 卡尔