【问题标题】:Fast MDX query on SSAS 2005 performs very badly on SSAS 2012SSAS 2005 上的快速 MDX 查询在 SSAS 2012 上执行得非常糟糕
【发布时间】:2015-01-09 11:17:04
【问题描述】:

我对 MDX 和 SSAS 的经验很少,所以不知道从哪里开始:

我们正在从 SQL 2005 环境迁移到 SQL 2012。在 SSAS 2005 上,下面的查询运行大约需要 3 到 4 秒。在 SSAS 2012 上运行相同的查询时,它会在完成前运行高达 1 小时 58 分钟。谁能解释一下为什么性能如此糟糕,以及如何改进它?我们使用的是 SQL 2012 11.0.5532.0 (X64)。

非常感谢。

with member [Measures].[Calculation] as
  Format(
        IIF(isempty([Measures].[average complience to requirements]), null,
        [Measures].[average complience to requirements]),
        "#,0.00"
  )

select
  non empty
  {
        [Measures].[average complience to requirements],
        [Measures].[Calculation]
  } on 0,
  nonempty
  (
        [Customer].[App Key Company Id].children *
        [Location].[App Key Region Id].children *
        [Category].[App Key Category Id].children *
        [Vendor].[App Key Vendor Id].children,
        [average complience to requirements]
  )  on 1
from
  [BSC]
where
  (
        strtomember(
              "[Date Submitted Date].[YYYY-MMMM-DD].[Month Of Year].&[" +  Format( Now(), "yyyyMM") + "]"
              ):
        strtomember(
              "[Date Submitted Date].[YYYY-MMMM-DD].[Month Of Year].&[" +  Format( Now(), "yyyyMM") + "]").Lag(2)

  )

【问题讨论】:

  • 请回答以下问题: 1. 'BSC' 立方体中有分区吗? 2. 'Date Submitted Date' 维度成员是否大于当前月份?
  • 为什么在两个轴上都选择[average complience to requirements]?从AXIS(1)删除它
  • @AlexPeshik 回答您的问题:1. 否 2. 否
  • @user2460549, 1. 所以,没有预取分区问题可能会导致速度变慢,这很好。 2. 我想,您可以通过将 WHERE 过滤器更改为 TAIL 功能来提高速度,如下所述。但不幸的是,这不是您问题的一般答案。您能否在分析器中创建两个具有最大 SSAS 相关事件数的跟踪 (informit.com/articles/article.aspx?p=1745747) 并分析它们?

标签: ssas mdx cube ssas-2012


【解决方案1】:

如果当前月份是[Date Submitted Date].[YYYY-MMMM-DD]层次结构的最后一个成员,查询可以简化为这个:

with member [Measures].[Calculation] as
  Format([Measures].[average complience to requirements],"#,0.00")
select
  {
        [Measures].[average complience to requirements],
        [Measures].[Calculation]
  } on 0,
  nonempty
  (
        [Customer].[App Key Company Id].children *
        [Location].[App Key Region Id].children *
        [Category].[App Key Category Id].children *
        [Vendor].[App Key Vendor Id].children,
        [average complience to requirements]
  )  on 1
from
  [BSC]
where
  Tail([Date Submitted Date].[YYYY-MMMM-DD].[Month Of Year].Members,3)
  1. 从轴 0 和 [Measures].[Calculation] 中删除了不必要的 Non Empty 检查。
  2. 使用 TAIL 函数代替动态成员,让服务器使用块模式而不是逐个单元格计算。

还请回答您留言下的问题,以便更好地了解可能存在的问题。

【讨论】:

  • 如果您对第 2 点的回答是肯定的,TAIL 将不起作用。另外,有时,我亲眼看到NON EMPTY 子句实际上加速查询。
  • @Sourav_Agasti,我完全同意你的说法。幸运的是,作者回答“否”,所以我们不需要添加一些棘手的逻辑。
  • 谢谢亚历克斯,我试过了,它只运行了几秒钟,但没有返回任何结果。尝试将尾部值设置为 20 运行它,但仍然没有返回数据。
  • @user2460549,我已经在我的样本数据上对其进行了测试,并且可以正常工作。抱歉浪费你的时间,也许我错过了一些东西,所以它只适用于我的数据。如果您有时间,请尝试部分替换代码片段:首先将 StrToMembers 替换为 TAIL 以及其余的主查询。比(如果有效),删除其他部分。如果不是,则删除非空和 IIF,然后使用 StrToMembers 过滤器版本进行测试。我还在想,为什么它不起作用......
【解决方案2】:

不确定这是否可行,但也试试这个:

这里将WITH 子句替换为subselect

with member [Measures].[Calculation] as
  Format(
        IIF(isempty([Measures].[average complience to requirements]), null,
        [Measures].[average complience to requirements]),
        "#,0.00"
  )

select
  non empty
  {
        [Measures].[average complience to requirements],
        [Measures].[Calculation]
  } on 0,
  nonempty
  (
        [Customer].[App Key Company Id].children *
        [Location].[App Key Region Id].children *
        [Category].[App Key Category Id].children *
        [Vendor].[App Key Vendor Id].children
        //[average complience to requirements] //removed
  )  on 1
from
  (

  SELECT 
  {
        strtomember(
              "[Date Submitted Date].[YYYY-MMMM-DD].[Month Of Year].&[" +  Format( Now(), "yyyyMM") + "]"
              ):
        strtomember(
              "[Date Submitted Date].[YYYY-MMMM-DD].[Month Of Year].&[" +  Format( Now(), "yyyyMM") + "]").Lag(2)

  } ON 0
  FROM [BSC]
  )

以下查询需要多长时间?

1) 无计算成员

//with member [Measures].[Calculation] as
//  Format(
//        IIF(isempty([Measures].[average complience to requirements]), null,
//        [Measures].[average complience to requirements]),
//        "#,0.00"
//)

select
  non empty
  {
      //  [Measures].[average complience to requirements], /////This measure removed
        [Measures].[Calculation]
  } on 0,
  nonempty
  (
        [Customer].[App Key Company Id].children *
        [Location].[App Key Region Id].children *
        [Category].[App Key Category Id].children *
        [Vendor].[App Key Vendor Id].children
        //[average complience to requirements] //removed
  )  on 1
  FROM [BSC]

  where (
  {
        strtomember(
              "[Date Submitted Date].[YYYY-MMMM-DD].[Month Of Year].&[" +  Format( Now(), "yyyyMM") + "]"
              ):
        strtomember(
              "[Date Submitted Date].[YYYY-MMMM-DD].[Month Of Year].&[" +  Format( Now(), "yyyyMM") + "]").Lag(2)

  }

  )

2) ROWS 上没有任何内容

with member [Measures].[Calculation] as
  Format(
        IIF(isempty([Measures].[average complience to requirements]), null,
        [Measures].[average complience to requirements]),
        "#,0.00"
)

select
  non empty
  {
        [Measures].[average complience to requirements], /////This measure removed
        [Measures].[Calculation]
  } on 0,
{} on 1
  FROM [BSC]

  where (
  {
        strtomember(
              "[Date Submitted Date].[YYYY-MMMM-DD].[Month Of Year].&[" +  Format( Now(), "yyyyMM") + "]"
              ):
        strtomember(
              "[Date Submitted Date].[YYYY-MMMM-DD].[Month Of Year].&[" +  Format( Now(), "yyyyMM") + "]").Lag(2)

  }

  )

3) 没有切片器

select
  non empty
  {
      //  [Measures].[average complience to requirements], /////This measure removed
        [Measures].[Calculation]
  } on 0,
  nonempty
  (
        [Customer].[App Key Company Id].children *
        [Location].[App Key Region Id].children *
        [Category].[App Key Category Id].children *
        [Vendor].[App Key Vendor Id].children
        //[average complience to requirements] //removed
  )  on 1
  FROM [BSC]

如果没有任何结论,只需执行一些更类似的故障排除,将问题的实际原因归零。一旦你弄清楚了,它就会很容易工作。对我们来说,在实际查询看起来还不错的情况下,在不了解内部立方体的情况下进行扶手椅分析显然是没有意义的。

【讨论】:

  • 感谢您的建议 - 尝试运行它并在 40 分钟后仍未完成时终止它。在 SSAS 2005 上大约需要 3-4 秒,所以我不知道为什么 SSAS 2012 会慢很多。
  • 查看更多查询以进行一些故障排除,如我的编辑所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
相关资源
最近更新 更多