2014-01-30 3 views
1

Я построил отчет SSRS, который получает CustomerID как параметр и запускает с ним запрос MDX.MDX SUB-SELECT vs WHERE ПРОБЛЕМЫ ПРОИЗВОДИТЕЛЬНОСТИ

С предложением WHERE требуется только 1 секунда, а если передать его в SUBSELECT, это займет 13 секунд! И я должен использовать подзапрос, потому что я хочу, чтобы показать имя члена в результатах

Синтаксис длинного запроса:

SELECT NON EMPTY { [Measures].[Revenue] } ON COLUMNS, 
NON EMPTY { ([CUBE DIM DATE].[Month CD].[Month CD].ALLMEMBERS * 
[CUBE DIM CUSTOMER].[Account MNG].[Account MNG].ALLMEMBERS * 
[CUBE DIM PRODUCT].[Product CD].[Product CD].ALLMEMBERS) } 
DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME, MEMBER_KEY ON ROWS FROM 
(SELECT ({ [CUBE DIM CUSTOMER].[Customer No].&[111111]}) on 0 from [CUBE_Prod]) 

Так что, если вместо последней строки я использую:

[CUBE_Prod] WHERE [CUBE DIM CUSTOMER].[Customer No].&[111111] 

... оставив все остальное, то это займет всего 1 секунду. Очевидно, я что-то отсутствует ...

Пожалуйста, помогите ...

Спасибо заранее

Майкл

+0

Если вы создаете запрос, вы знаете, что клиент нет, и можете поместить его в отчет, не возвращая его по запросу. – FrankPl

ответ

1

Пара вариантов приходят на ум ...

Вариант 1: использовать версию WHERE-clause и создать вычисляемый элемент для отображения значения элемента slicer в наборе результатов ...

WITH MEMBER SlicerValue AS 
    IIF(
     IsEmpty([Measures].[Revenue]) 
     ,NULL 
     ,[CUBE DIM CUSTOMER].[Customer No].CurrentMember.MemberValue 
    ) 
SELECT 
    NON EMPTY { 
     SlicerValue 
     ,[Measures].[Revenue] 
    } ON COLUMNS, 
    NON EMPTY { 
     ( 
      [CUBE DIM DATE].[Month CD].[Month CD].AllMembers * 
      [CUBE DIM CUSTOMER].[Account MNG].[Account MNG].AllMembers * 
      [CUBE DIM PRODUCT].[Product CD].[Product CD].AllMembers 
     ) 
    } Dimension Properties MEMBER_CAPTION, MEMBER_UNIQUE_NAME, MEMBER_KEY ON ROWS 
FROM [CUBE_Prod] 
WHERE [CUBE DIM CUSTOMER].[Customer No].&[111111] 

Вариант 2: Использование выражения SSRS для построения идеального MDX. в приведенном ниже коде вы должны ссылаться на значение параметра, чтобы «[CUBE DIM CUSTOMER]. [Customer No]. & [111111]» является динамическим.

SELECT 
    NON EMPTY { 
     [Measures].[Revenue] 
    } ON COLUMNS, 
    NON EMPTY { 
     ( 
      [CUBE DIM DATE].[Month CD].[Month CD].AllMembers * 
      [CUBE DIM CUSTOMER].[Account MNG].[Account MNG].AllMembers * 
      [CUBE DIM PRODUCT].[Product CD].[Product CD].AllMembers * 
      [CUBE DIM CUSTOMER].[Customer No].&[111111] 
     ) 
    } Dimension Properties MEMBER_CAPTION, MEMBER_UNIQUE_NAME, MEMBER_KEY ON ROWS 
FROM [CUBE_Prod] 
+0

Большое спасибо! Вариант 2 настолько прямолинейный ... Как я и думал - я упустил возможность поместить участника непосредственно в CROSSJOIN из инструкции SELECT ... Мысль только о ГДЕ и СУЩЕСТВУЮЩЕМ ... Интересно все же - почему производительность SUBSELECT настолько слаб ... Спасибо! Майкл – mshparber

+0

Да, разница в производительности интересна ... это доход от расчетного члена? –

+0

Aha ... Да, это так, я проверю разницу в производительности на первоначальном измерении ... – mshparber

Смежные вопросы