Низкая производительность таблиц SSAS / DAX

Я новичок в SSAS Tabular и DAX. Я построил модель данных и успешно обработал. Сейчас я нахожусь в процессе перекодирования отчета SSRS, чтобы использовать SSAS Tabular вместо обращения к таблицам и индексированным представлениям в хранилище данных.

Таблица фактов, против которой я пишу этот конкретный DAX-запрос, имеет размер ~220 миллионов записей. Ниже приведен запрос:

DEFINE
VAR Ind_Fact_Summ_Matter_By_Day_By_Posted =     
//SAMPLE(1000,
    ADDCOLUMNS
    (
        SUMMARIZE
        (
            'Revenue Summary',
            'Revenue Summary'[AK_Tran_Date],
            'Revenue Summary'[AK_Post_Date],
            'Revenue Summary'[AK_Period],
            'Revenue Summary'[AK_Current_Matter],
            'Revenue Summary'[AK_Matter],
            'Revenue Summary'[AK_Exchange_DateRange]
        ),
        "Debt_Total_Outstanding", CALCULATE([Total Debt Total Outstanding]), --CALCULATE(SUM('Revenue Summary'[Debt_Total_Outstanding]))
        "Fees_WIP_Amount", CALCULATE(SUM('Revenue Summary'[Fees_WIP_Amount])),
        "Disbs_Soft_WIP", CALCULATE(SUM('Revenue Summary'[Disbs_Soft_WIP])),
        "Disbs_Hard_WIP", CALCULATE(SUM('Revenue Summary'[Disbs_Hard_WIP])),
        "Disbs_Total_WIP", CALCULATE(SUM('Revenue Summary'[Disbs_Total_WIP])),
        "Fees_Base_Amount", CALCULATE(SUM('Revenue Summary'[Fees_Base_Amount])),
        "Debt_Total_Billed", CALCULATE(SUM('Revenue Summary'[Debt_Total_Billed])),
        "Net_Revenue", CALCULATE(SUM('Revenue Summary'[Net_Revenue])),
        "Fees_Net_Revenue", CALCULATE(SUM('Revenue Summary'[Fees_Net_Revenue])),
        "Other_Revenue", CALCULATE(SUM('Revenue Summary'[Other_Revenue])),
        "Total_Cost_Amt", CALCULATE(SUM('Revenue Summary'[Total_Cost_Amt])),
        "Fees_WIP_reserve", CALCULATE(SUM('Revenue Summary'[Fees_WIP_Reserve])),
        "Other_Disbs_WIP_Reserve", CALCULATE(SUM('Revenue Summary'[Other_Disbs_WIP_Reserve])),
        "Debt_Total_Reserve", CALCULATE(SUM('Revenue Summary'[Debt_Total_Reserve])),
        "Billable_Hours", CALCULATE(SUM('Revenue Summary'[Billable_Hours])),
        "Partner_Billable_Hours", CALCULATE(SUM('Revenue Summary'[Partner_Billable_Hours])),
        "Legal_Staff_Billable_Hours", CALCULATE(SUM('Revenue Summary'[Legal_Staff_Billable_Hours])),
        "Standard_Revenue_No_Secondment", CALCULATE(SUM('Revenue Summary'[Standard_Revenue_No_Secondment])),
        "Standard_Revenue_Secondment", CALCULATE(SUM('Revenue Summary'[Standard_Revenue_Secondment])),
        "Fees_Standard_Revenue", CALCULATE(SUM('Revenue Summary'[Fees_Standard_Revenue])),
        "Fees_Billed_WIP_Writeoff", CALCULATE(SUM('Revenue Summary'[Fees_Billed_WIP_Writeoff])),
        "Debt_Writeoff_Secondment", CALCULATE(SUM('Revenue Summary'[Debt_Writeoff_Secondment])),
        "Debt_Writeoff_No_Secondment", CALCULATE(SUM('Revenue Summary'[Debt_Writeoff_No_Secondment])),
        "WIP_Reserve", CALCULATE(SUM('Revenue Summary'[Fees_WIP_Reserve]) + SUM('Revenue Summary'[Other_Disbs_WIP_Reserve])),
        "Total_Reserve", CALCULATE(SUM('Revenue Summary'[Fees_WIP_Reserve]) + SUM('Revenue Summary'[Other_Disbs_WIP_Reserve]) + SUM('Revenue Summary'[Debt_Total_Reserve]))
    )
//  ,RAND()
//)
EVALUATE 
    Ind_Fact_Summ_Matter_By_Day_By_Posted

Как видите, это довольно простой DAX-запрос - агрегирование некоторых метрик. "Сводка доходов" - это большая таблица фактов, о которой я говорил, которая насчитывает 220 миллионов записей. Когда я запустил запрос в DAX Studio, он не прошел из-за ограничений памяти. Когда я сделал SAMPLE или TOPN 1000, это заняло 5 минут! и это возвращало только 1 агрегированную метрику (остальное я прокомментировал - только для целей тестирования)!

Я не уверен, что это модель, DAX, аппаратное обеспечение или их комбинация, которые вызывают такую ​​низкую производительность. Сервер разработки, на котором размещена табличная модель, является виртуальным сервером со следующими характеристиками (на основе CPU-Z):

  • Intel Xeon E5 (8 ядер, 4 разъема)
  • 90 ГБ ОЗУ
  • Тип памяти: EDO (не уверен, что это такое?!)
  • Частота DRAM: 66,0 МГц (медленно как??)
  • В состоянии покоя используется 47% оперативной памяти. Когда я запустил запрос (без TOPN 1000), он работал до тех пор, пока не потерпел неудачу из-за ограничений памяти и загрузки ЦП, довольно высокой - 80-90%.

Также, как я упоминал выше, я перекодирую отчет SSRS, который был написан с использованием индексированных представлений. Обратите внимание, что запрос является лишь частью более крупного запроса, который использует отчет. Отчет длится около минуты, поэтому я ищу способ ускорить его с помощью SSAS Tabular. Когда я выполнил ТОП 1000 эквивалентного запроса в SQL с использованием индексированного представления, это заняло всего 1 секунду, поэтому похоже, что SSAS Tabular меня здесь не устраивает?!

Что я должен сделать, чтобы значительно улучшить производительность? Что-то я не так сделал?

Любое руководство будет высоко ценится. Спасибо

РЕДАКТИРОВАТЬ: Использование SSAS 2016 в режиме таблиц / в памяти / импорта (не DirectQuery)

1 ответ

Ваша ошибка в том, что вы используете Summarize для суммирования некоторых столбцов - но не всех! Вы можете использовать Summarizecolumns и просто суммировать все столбцы за один раз, поэтому вместо:

VAR Ind_Fact_Summ_Matter_By_Day_By_Posted =     
//SAMPLE(1000,
    ADDCOLUMNS
    (
        SUMMARIZE
        (
            'Revenue Summary',
            'Revenue Summary'[AK_Tran_Date],
            'Revenue Summary'[AK_Post_Date],
            'Revenue Summary'[AK_Period],
            'Revenue Summary'[AK_Current_Matter],
            'Revenue Summary'[AK_Matter],
            'Revenue Summary'[AK_Exchange_DateRange]
        ),
        "Debt_Total_Outstanding", CALCULATE([Total Debt Total Outstanding]), --CALCULATE(SUM('Revenue Summary'[Debt_Total_Outstanding]))
        "Fees_WIP_Amount", CALCULATE(SUM('Revenue Summary'[Fees_WIP_Amount])),
        "Disbs_Soft_WIP", CALCULATE(SUM('Revenue Summary'[Disbs_Soft_WIP])),
        "Disbs_Hard_WIP", CALCULATE(SUM('Revenue Summary'[Disbs_Hard_WIP])),

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

VAR Ind_Fact_Summ_Matter_By_Day_By_Posted =     
SUMMARIZE
            (
                'Revenue Summary',
                'Revenue Summary'[AK_Tran_Date],
                'Revenue Summary'[AK_Post_Date],
                'Revenue Summary'[AK_Period],
                'Revenue Summary'[AK_Current_Matter],
                'Revenue Summary'[AK_Matter],
                'Revenue Summary'[AK_Exchange_DateRange], 
'Revenue Summary'[Debt_Total_Outstanding],
'Revenue Summary'[Fees_WIP_Amount],
'Revenue Summary'[Disbs_Soft_WIP],
'Revenue Summary'[Disbs_Hard_WIP]
            )

В разделе "Добавить столбцы" нет абсолютно никакой причины добавлять вычисляемую меру (если она уже не предопределена). В разделе ADDCOLUMNS мы добавляем атрибуты, которые мы хотим сгруппировать по ним.

Другие вопросы по тегам