Быстрый запрос многомерных выражений в службах SSAS 2005 очень плохо работает в службах SSAS 2012.

У меня очень мало опыта работы с 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)

  )

person user2460549    schedule 09.01.2015    source источник
comment
Пожалуйста, ответьте на следующие вопросы: 1. Есть ли в кубе "BSC" разделы? 2. Есть ли элементы измерения «Дата отправки даты» больше, чем текущий месяц?   -  person Alex Peshik    schedule 09.01.2015
comment
Почему вы выбираете [average complience to requirements] в обеих осях? Удалите его из AXIS(1)   -  person SouravA    schedule 09.01.2015
comment
@AlexPeshik Чтобы ответить на ваши вопросы: 1. Нет 2. Нет   -  person user2460549    schedule 09.01.2015
comment
@ user2460549, 1. Таким образом, проблема с предварительной загрузкой разделов не может вызвать это замедление, это хорошо. 2. Я думаю, вы можете увеличить скорость, изменив фильтр WHERE на функцию TAIL, как описано ниже. Но, к сожалению, это не общий ответ на ваш вопрос. Не могли бы вы создать две трассировки в профилировщике с максимальным количеством событий, связанных со службами SSAS (informit. com/articles/article.aspx?p=1745747) и анализировать их?   -  person Alex Peshik    schedule 09.01.2015


Ответы (2)


Если текущий месяц является последним элементом иерархии [Дата отправки].[ГГГГ-ММММ-ДД], запрос может быть упрощен до следующего:

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 и [Измерения].[Расчет] удалены ненужные проверки «Не пусто».
  2. Функция TAIL используется вместо динамических членов, чтобы позволить серверу использовать блочный режим вместо вычисления по ячейкам.

Пожалуйста, также ответьте на вопросы под своим сообщением, чтобы лучше понять возможные проблемы.

person Alex Peshik    schedule 09.01.2015
comment
Если ответ на ваш пункт № 2 положительный, TAIL не сработает. Кроме того, иногда я лично видел, что предложение NON EMPTY на самом деле ускоряет запрос. - person SouravA; 09.01.2015
comment
@Sourav_Agasti, я полностью согласен с вашими утверждениями. К счастью, автор ответил «Нет», поэтому нам не нужно добавлять какую-то хитрую логику. - person Alex Peshik; 09.01.2015
comment
Спасибо, Алекс, я попробовал это, и оно работало всего пару секунд, но не дало никаких результатов. Попытался запустить его со значением хвоста, установленным на 20, и все равно данные не были возвращены. - person user2460549; 09.01.2015
comment
@user2460549 user2460549, я проверил его на своих примерах данных, и он работает. Извините за потраченное время, может я что-то упустил, поэтому работает только с моими данными. Если у вас есть время, попробуйте частично заменить фрагменты кода: сначала StrToMembers на TAIL с остальной частью вашего основного запроса. Затем (если работает) удалите другие части. Если нет, удалите непустые файлы и IIF, а затем проверьте версию фильтра StrToMembers. Я до сих пор думаю, почему это не работает... - person Alex Peshik; 09.01.2015

Не уверен, что это сработает, но попробуйте и это:

Здесь заменен пункт 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]

Если из них ничего не получается, просто выполните еще одно аналогичное устранение неполадок, чтобы определить фактическую причину проблемы. Как только вы разберетесь, будет легко работать над этим. Для нас, очевидно, бессмысленно проводить анализ в кресле, не имея представления о внутреннем кубе, когда фактический запрос выглядит вполне нормально.

person SouravA    schedule 09.01.2015
comment
Спасибо за предложение - попытался запустить это и прервал его, когда он еще не закончился через 40 минут. В SSAS 2005 это около 3-4 секунд, поэтому я не знаю, почему SSAS 2012 будет намного медленнее. - person user2460549; 09.01.2015
comment
Проверьте еще несколько запросов, чтобы устранить неполадки, как указано в моем редактировании. - person SouravA; 09.01.2015