Filter () работает слишком медленно в PowerPivot Query - PullRequest
0 голосов
/ 11 мая 2018

У меня вопрос по коду MDX, я пытаюсь отфильтровать значения из показателя в моем кубе, который содержит несколько номеров учетных записей, однако производительность слишком низкая, и я не смог найти лучшего решения, чем

Filter
(
  [Cost Element].[ZCE Level08].[ZCE Level08].ALLMEMBERS
 ,
   Instr
     (
       [Cost Element].[ZCE.Level08].CurrentMember.Properties('Member_Caption')
                                     ,'A12600100'
     ) = 0

    AND 
      Instr
          (
             [Cost Element].[ZCE Level08].CurrentMember.Properties('Member_Caption')
                                     ,'A12600300'
          ) = 0
)

Этот код выполняет фильтрацию любых строк, содержащих какие-либо учетные записи в коде, однако это очень большой куб, и мне нужно добавить еще 17 учетных записей, что делает этот фильтрРеально медленно, есть ли лучшее решение, чем это?

Заранее спасибо, ребята!

1 Ответ

0 голосов
/ 17 мая 2018

Хорошо, есть гораздо более быстрый подход - используйте функцию EXCEPT вместо FILTER и создайте набор исключений, используя фактические элементы, а не идентифицируйте их с помощью instr:

EXCEPT
(
  [Cost Element].[ZCE Level08].[ZCE Level08].ALLMEMBERS
 ,
  {
    [Cost Element].[ZCE.Level08].[ZCE Level08].[A12600100],
    [Cost Element].[ZCE.Level08].[ZCE Level08].[A12600300]
  }
)

Если вам нужно использовать FILTER, то просто избавиться от бита member_caption / instr должно значительно ускорить процесс:

FILTER
(
  [Cost Element].[ZCE Level08].[ZCE Level08].ALLMEMBERS
 ,
   [Cost Element].[ZCE.Level08].CurrentMember
     IS NOT [Cost Element].[ZCE.Level08].[ZCE Level08].[A12600100]
   AND 
   [Cost Element].[ZCE.Level08].CurrentMember
     IS NOT [Cost Element].[ZCE.Level08].[ZCE Level08].[A12600300]
)
...