Простой вычисляемый член, работающий навсегда - MDX - PullRequest
0 голосов
/ 04 октября 2019

Я столкнулся с очень странной проблемой с MDX (SSAS 2014), из-за которой простейший вычисляемый элемент выполняется вечно. Может кто-нибудь, пожалуйста, помогите мне понять, почему я сталкиваюсь с этой проблемой. Если я не использую вычисленный член, все работает быстро, и результат приходит в считанные секунды. Когда я удаляю атрибут Producer, запрос выполняется хорошо.

Ниже приведен полный запрос.

WITH MEMBER Measures.AsOfDate AS ("[Дата вступления в силу политики]. [Год-месяц]. [Дата]]. & [2018-01-04T00: 00: 00] ")

MEMBER Measures. YTDPremium AS AGGREGATE (YTD (STRTOMEMBER (Measures.AsOfDate)), [Меры]. [Письменный премиум]) ВЫБРАТЬ НЕТEMPTY {Measures.YTDPremium

} НА КОЛОННАХ, NON EMPTY {([Программа]. [Название программы]. [Название программы]

, [Страховая компания]. [Название страховой компании]. [Название страховой компании]

, [Сфера деятельности]. [Сфера деятельности]. [Сфера деятельности]

, [Производитель]. [Имя производителя]. [Имя производителя]

)} НА СТРОКАХ ОТ [Премиум]

1 Ответ

0 голосов
/ 04 октября 2019

Попытайтесь понять, что следующая часть делает в вашем запросе

NON EMPTY {([Программа]. [Название программы]. [Имя программы]

, [Страховая компания]. [Название страховой компании]. [Название страховой компании]

, [Сфера деятельности]. [Сфера деятельности]. [Сфера деятельности]

, [Производитель]. [Имя производителя]. [Имя производителя]

)} ON ROWS

В приведенном выше многомерном выражении вы говорите серверу взять перекрестный продукт всех значений «Программы», «СтрокаБизнес "и" Имя продюсера ". Допустим, у вас есть 4 значения программ, 3 значения бизнес-направления и 2 значения имени производителя. Общее количество комбинаций: 4 * 3 * 2 = 24

Теперь «Непустой» удаляет любые комбинации, которых нет в вашем наборе данных. Это делается путем удаления всех строк, имеющих значение «Null» в значении столбца.

Ваша мера возвращает значение независимо от того, существует эта комбинация или нет. Вы можете изменить вычисленное значение, чтобы оно возвращало значение только в том случае, если комбинация действительна. Это может быть достигнуто путем проверки фактического показателя для этой комбинации

Редактировать: на основе приведенного ниже примера на основе комментария

В приведенном ниже примере я пытаюсь получить категории суммы интернет-продаж икомпоненты

select 
{ [Measures].[Internet Sales Amount]  } 
on columns,
(
[Product].[Category].[Category],
[Customer].[Country].[Country]
)
on rows 
from [Adventure Works]

Результат enter image description here

Теперь добавьте «Не пусто» в запрос и просмотрите результаты.

Результаты enter image description here

Теперь давайте добавим вычисляемую меру, которая возвращает «привет». Обратите внимание, что непустое предложение неэффективно.

enter image description here

Теперь измените код, чтобы вычисляемая мера проверила другие показатели на ноль

with member measures.t as 
case when [Measures].[Internet Sales Amount] = null then null else "hello" end

select 
{ [Measures].[Internet Sales Amount] ,measures.t }
on columns,
non empty
(
[Product].[Category].[Category],
[Customer].[Country].[Country]
)
on rows 
from [Adventure Works]

Результат

enter image description here

Итог: из-за перекрестного продукта ваш результат настолько велик, что SSAS с трудом справляется с этим.

...