2013-09-23 2 views
1

У меня есть два вида отчетов (отправка отчетов и получение отчетов) и два ролевых размера (отправители и приемники). Я пытаюсь сравнить суммы из каждого отчета для одной организации с помощью отправителей/получателей.Оптимизация MDX Расчетная величина с LINKMEMBER

Мой текущий запрос:

with member [Measures].[SentAmount] as ([Receiver].[Code].&[XXX],[Measures].[Sent]) 
member [Measures].[ReceivedAmount_Temp] as 
    (
     [Sender].[Code].&[XXX], 
     [Measures].[Received] 
    ) 
member [Measures].[ReceivedAmount] as 
(
    LINKMEMBER 
    (
     [Sender].[Code].CURRENTMEMBER,[Receiver].[Code] 
    ), 
    root([Sender]), 
    [Measures].[ReceivedAmount_Temp] 
) 
SELECT 
{ 
[Measures].[SentAmount], 
[Measures].[ReceivedAmount] 
} ON COLUMNS, 
NON EMPTY 
{ (
    [Sender].[Code].[Code].ALLMEMBERS 
    *[Sender].[Name].[Name].ALLMEMBERS 

)} FROM MyCube 

Результат является корректным, но время выполнения очень долго. Особенно по реальному запросу, где у меня есть 15-20 мер.

Можно ли каким-либо образом оптимизировать этот запрос?

+0

Можете вы изменить куб, или это будет оптимизация MDX для существующего куба? – FrankPl

+0

Предпочтительно не менять существующий куб. Но если оптимизация MDX невозможна, я могу внести изменения. – zlatkovin

+0

К сожалению, я до сих пор не могу найти решение. Буду признателен за любую помощь. – zlatkovin

ответ

1

Это не полное решение, а подход: как насчет использования «таблицы ролевых игр»: у вас будет две копии таблицы фактов, которые называются «Отправлено» и «Получено». Оба будут ссылаться на один и тот же размер «Клиент» (из таблицы полученных фактов, как получателя, и из таблицы отправленных фактов в качестве отправителя). Другая сторона (отправитель для полученного факта и получатель из факта отправленного) также будет ссылаться на таблицу клиентов, на этот раз с измерением ролевой игры.

Технически вы можете реализовать это с помощью представлений или именованных запросов в DSV, поскольку графический интерфейс BIDS не позволяет использовать одну таблицу фактов для двух групп мер.

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

+0

Похож на приятное и простое решение. Я обязательно попробую это. Плохо то, что 3 из 4 таблиц фактов, используемых в этом запросе, очень велики и требуют много времени для обработки. – zlatkovin

0

Попробуйте заменить функцию root() для явного члена [All]. По какой-то странной причине root() работал очень медленно, когда я попытался использовать функцию LinkedMember() для моих рассчитанных мер.

Надеюсь, это тоже поможет!

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