ADW-查询性能问题

时间:2018-12-07 16:36:05

标签: azure azure-sqldw

我有第2代DW500c的Azure SQL仓库设置,并且其中有一个带有多个表的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 :(得分:0)

有些事情可以尝试,看看您是否可以更快地进行操作-

使用带有“ RoundRobin”选项的“按选择创建表”(CTAS)创建表并进行查询。我觉得将大量行返回给您的客户可能是造成时间损失的重要因素。如果CTAS在5分钟之内结束,您可以放心地说,其余时间都由返还操作占用。

如果没有,您可以在表中实现一些左连接,然后将该表添加到主查询中以查看其完成速度是否更快。

您还可以查看解释计划,以查看是否可以通过对齐公共键上的表来减少某些步骤。