MDX-запрос выполняется более часа - PullRequest
0 голосов
/ 22 февраля 2019

Я новичок в запросах MDX.Я написал запрос, который использует ведущую функцию, чтобы получить значения для (Текущая неделя плюс 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 голосов
/ 31 марта 2019

Ваш 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];
...