ADW - вопросы производительности запросов - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть установка хранилища SQL Azure DW500c поколения 2, и у меня есть модель Data Vault с несколькими таблицами.Я пытаюсь выполнить один запрос, который, по моему мнению, занимает слишком много времени.

Вот запрос, который я выполняю:

SELECT 
    H_PROFITCENTER.[BK_PROFITCENTER]
    ,H_ACCOUNT.[BK_ACCOUNT]
    ,H_LOCALCURRENCY.[BK_CURRENCY]
    ,H_DOCUMENTCURRENCY.[BK_CURRENCY]
    ,H_COSTCENTER.[BK_COSTCENTER]
    ,H_COMPANY.[BK_COMPANY]
    ,H_CURRENCY.[BK_CURRENCY]
    ,H_INTERNALORDER.[BK_INTERNALORDER]
    ,H_VERSION.[BK_VERSION]
    ,H_COSTELEMENT.[BK_COSTELEMENT]
    ,H_CALENDARDATE.[BK_DATE]
    ,H_VALUETYPEREPORT.[BK_VALUETYPEREPORT]
    ,H_FISCALPERIOD.[BK_FISCALPERIOD]
    ,H_COUNTRY.[BK_COUNTRY]
    ,H_FUNCTIONALAREA.[BK_FUNCTIONALAREA]
    ,SLADI.[LINE_ITEM]
    ,SLADI.[AMOUNT]
    ,SLADI.[CREDIT]
    ,SLADI.[DEBIT]
    ,SLADI.[QUANTITY]
    ,SLADI.[BALANCE]
    ,SLADI.[LOADING_DATE]
FROM [dwh].[L_ACCOUNTINGDOCUMENTITEMS] AS LADI
    INNER JOIN [dwh].[SL_ACCOUNTINGDOCUMENTITEMS] AS SLADI ON LADI.[HK_ACCOUNTINGDOCUMENTITEMS] = SLADI.[HK_ACCOUNTINGDOCUMENTITEMS]
    LEFT JOIN dwh.H_PROFITCENTERAS H_PROFITCENTER ON H_PROFITCENTER.[HK_PROFITCENTER] =  LADI.[HK_PROFITCENTER]
    LEFT JOIN dwh.H_ACCOUNT AS H_ACCOUNT ON H_ACCOUNT.[HK_ACCOUNT] =  LADI.[HK_ACCOUNT]
    LEFT JOIN dwh.H_CURRENCY AS H_LOCALCURRENCY ON H_LOCALCURRENCY.[HK_CURRENCY] =  LADI.[HK_LOCALCURRENCY]
    LEFT JOIN dwh.H_CURRENCY   AS H_DOCUMENTCURRENCY  ON H_DOCUMENTCURRENCY.[HK_CURRENCY] =  LADI.[HK_DOCUMENTCURRENCY]
    LEFT JOIN dwh.H_COSTCENTER AS H_COSTCENTER  ON H_COSTCENTER.[HK_COSTCENTER] =  LADI.[HK_COSTCENTER]
    LEFT JOIN dwh.H_COMPANY AS H_COMPANY ON H_COMPANY.[HK_COMPANY] =  LADI.[HK_COMPANY]
    LEFT JOIN dwh.H_CURRENCY AS H_CURRENCY  ON H_CURRENCY.[HK_CURRENCY] =  LADI.[HK_CURRENCY]
    LEFT JOIN dwh.H_INTERNALORDERAS H_INTERNALORDER ON H_INTERNALORDER.[HK_INTERNALORDER] =  LADI.[HK_INTERNALORDER]
    LEFT JOIN dwh.H_VERSION AS H_VERSION ON H_VERSION.[HK_VERSION] =  LADI.[HK_VERSION]
    LEFT JOIN dwh.H_COSTELEMENT AS H_COSTELEMENT  ON H_COSTELEMENT.[HK_COSTELEMENT] =  LADI.[HK_COSTELEMENT]
    LEFT JOIN dwh.H_DATE AS H_CALENDARDATE ON H_CALENDARDATE.[HK_DATE] =  LADI.[HK_CALENDARDATE]
    LEFT JOIN dwh.H_VALUETYPEREPORTAS H_VALUETYPEREPORT ON H_VALUETYPEREPORT.[HK_VALUETYPEREPORT] =  LADI.[HK_VALUETYPEREPORT]
    LEFT JOIN dwh.H_FISCALPERIODAS H_FISCALPERIOD ON H_FISCALPERIOD.[HK_FISCALPERIOD] =  LADI.[HK_FISCALPERIOD]
    LEFT JOIN dwh.H_COUNTRY AS H_COUNTRY ON H_COUNTRY.[HK_COUNTRY] =  LADI.[HK_COUNTRY]
    LEFT JOIN dwh.H_FUNCTIONALAREAAS H_FUNCTIONALAREA ON H_FUNCTIONALAREA.[HK_FUNCTIONALAREA] =  LADI.[HK_FUNCTIONALAREA]

Этот запрос занимает у меня 22 минуты.

Я должен сказать, что он возвращает около 1200000000 строк.

[L_ACCOUNTINGDOCUMENTITEMS] и [SL_ACCOUNTINGDOCUMENTITEMS] - это хеш, распределенный по столбцу [HK_ACCOUNTINGDOCUMENTITEMS], а все остальные таблицы были созданы с распределением реплицированных таблиц.

Кроме того, я активировал автоматическое создание статистики в хранилище данных Azure.

Может кто-нибудь помочь мне понять, как я могу ускорить его?

1 Ответ

0 голосов
/ 07 декабря 2018

Вот несколько вещей, которые вы можете попробовать, если вы сделаете это быстрее -

Создайте таблицу, используя опцию «Создать таблицу как выбор» (CTAS) с параметром RoundRobin для вашего запроса, и определите время этого.У меня есть ощущение, что возвращение такого большого количества строк вашему клиенту может быть большим вкладом во время.Если CTAS заканчивает работу, скажем, 5 минут, вы можете с уверенностью сказать, что оставшееся время занимает операция возврата.

Если нет, вы можете материализовать некоторые из левых объединений в таблицу, а затем добавить эту таблицу в основной запрос, чтобы увидеть, завершится ли это быстрее.

Вы также можете посмотреть планы объяснения, чтобыпосмотрите, можете ли вы сократить некоторые шаги, выровняв таблицы по общему ключу.

...