MDX查询运行了一个多小时

时间:2019-02-22 05:23:41

标签: ssas mdx mdx-query

我是MDX查询的新手。我编写了一个查询,该查询使用Lead函数获取(当前周加1)的值作为每个指标的新列。基本上将当前周值与上周值进行比较。没有新成员,查询将在几秒钟内运行。添加新成员后,它将永久运行。请提出优化此查询的方法 感谢您的帮助。

WITH
SET [Range] as strtomember
(" [Time].[Week].&["+ Format(DateAdd('d', - DatePart('w', Now(), 2), Now()+7), "yyyy-MM-ddT00:00:00")
           +"]")

:strtomember
(" [Time].[Week].&["+ Format(DateAdd('d', - DatePart('w', Now(), 2), Now()+14), "yyyy-MM-ddT00:00:00")
           +"]")

MEMBER [Measures].[SalesNew] as
CASE   WHEN [Time].[Year].CURRENTMEMBER IS [Time].[Year].&[2019] THEN
sum([Time].[Day].CURRENTMEMBER.LEAD(7),[Measures].[Sales Prev])
ELSE null
END,FORMAT_STRING = "$#,###.00"

MEMBER [Measures].[Order UnitsNew] as
CASE   WHEN [Time].[Year].CURRENTMEMBER IS [Time].[Year].&[2019] THEN
sum([Time].[Day].CURRENTMEMBER.LEAD(7),[Measures].[Order Units Prev])
ELSE null
END,FORMAT_STRING = "#,##0"

MEMBER [Measures].[Count of OrdersNew] as
CASE   WHEN [Time].[Year].CURRENTMEMBER IS [Time].[Year].&[2019] THEN
sum([Time].[Day].CURRENTMEMBER.LEAD(7),[Measures].[Count of Orders Prev])
ELSE null
END,FORMAT_STRING = "#,##0"

SELECT
    {  [Measures].[Sales],[Measures].[Sales Prev],[Measures].[SalesNew],[Measures].[Order Units],[Measures].[Order Units Prev],
     [Measures].[Order UnitsNew], [Measures].[Count of Orders],[Measures].[Count of Orders Prev], [Measures].[Count of OrdersNew]} ON COLUMNS ,
      [Range] *
      [Time].[Day].[Day].ALLMEMBERS * -- 4
      [Time].[Hour].ALLMEMBERS *
      [Product].[Merch Dept].ALLMEMBERS *
      [Product].[Class].ALLMEMBERS ON ROWS
FROM [Cube]

1 个答案:

答案 0 :(得分:0)

您的MDX看起来很酷。 优化MDX有点黑魔法-您只需要尝试替代方法即可。

最初我会尝试:

1。交换strToSet而不是两个strToMember函数。
   2.您是否需要条件[Time].[Year].CURRENTMEMBER IS [Time].[Year].&[2019]?我问的原因是[Range]似乎     已经是2019年了,您会交叉加入该场景,所以您需要     担心2019年?
    3.您可以使用简单的元组代替汇总SUM
    4.也许在测试时,可能值得删除format_strings-应该没什么不同,但如果可以的话,可以添加回来。

我尚未测试以下内容,因此请打错输入:

WITH
SET [DateSet] AS
strtoSet
(
   "[Time].[Week].&[" 
  + Format(DateAdd('d', - DatePart('w', Now(), 2), Now()+7), "yyyy-MM-ddT00:00:00")
  + "]:[Time].[Week].&["
  + Format(DateAdd('d', - DatePart('w', Now(), 2), Now()+14), "yyyy-MM-ddT00:00:00")
  +"]"
)
MEMBER [Measures].[SalesNew] AS
(
   [Time].[Day].CURRENTMEMBER.LEAD(7)
  ,[Measures].[Sales Prev]
)
MEMBER [Measures].[Order UnitsNew] AS
(
   [Time].[Day].CURRENTMEMBER.LEAD(7)
  ,[Measures].[Order Units Prev]
)
MEMBER [Measures].[Count of OrdersNew] AS
(
    [Time].[Day].CURRENTMEMBER.LEAD(7)
   ,[Measures].[Count of Orders Prev]
)
SELECT
    {  
       [Measures].[Sales]
      ,[Measures].[Sales Prev]
      ,[Measures].[SalesNew]
      ,[Measures].[Order Units]
      ,[Measures].[Order Units Prev]
      ,[Measures].[Order UnitsNew]
      ,[Measures].[Count of Orders]
      ,[Measures].[Count of Orders Prev]
      ,[Measures].[Count of OrdersNew]
    } ON COLUMNS ,
      [DateSet] *
      [Time].[Day].[Day].ALLMEMBERS * 
      [Time].[Hour].ALLMEMBERS *
      [Product].[Merch Dept].ALLMEMBERS *
      [Product].[Class].ALLMEMBERS ON ROWS
FROM [Cube];
相关问题