【问题标题】:ADW - Query performance issuesADW - 查询性能问题
【发布时间】:2018-12-10 05:32:12
【问题描述】:

我有一个 gen2 的 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 datawarehouse 中激活了自动统计创建。

谁能帮助我了解如何加快速度?

【问题讨论】:

  • 请提供一些诊断信息... 哪些表是 CCI 或 Heap?您的查询在哪个资源类下运行,尤其是构建表的 ELT 查询? hash-dist 表是否均匀分布(不倾斜)?是否已在所有表上创建(和更新)统计信息?
  • 并且,如果可能,请发布一个链接,指向通过在查询前面放置单词 EXPLAIN 生成的查询计划。它是一个 XML 文件,可以准确地告诉我们幕后发生的事情。
  • 你在用这 12 亿行做什么?你是通过网络退货吗?或者你正在做一个 CTAS 来创建一个新表?
  • 我刚刚edited your question,改进了its quality,以帮助人们理解您的问题,并帮助您获得适当的答案。
  • 大家好。为了给出一些答案,我必须说所有表都是使用聚集列存储索引创建的。我正在通过网络返回所有行,但我尝试使用 CTAS 创建一个包含从查询返回的所有行的表,但这需要相同的时间。

标签: azure azure-sqldw


【解决方案1】:

这里有一些事情可以尝试,看看你是否能加快速度 -

使用带有 RoundRobin 选项的“Create Table as Select” (CTAS) 为您的查询创建一个表,并计算时间。我有一种感觉,将大量行返回给您的客户可能会占用大量时间。如果 CTAS 在 5 分钟内完成,您可以有把握地说,其余时间由返回操作占用。

如果没有,您可以将一些左联接具体化到一个表中,然后将该表添加到主查询中,看看是否完成得更快。

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

【讨论】:

  • 你好,默谢德。谢谢您的帮助。我尝试使用 CTAS 创建一个包含此查询的所有返回行的表,但它花费了相同的时间。如何在此处共享查询中的查询计划 xml 文件?
  • 这里是这个查询的查询计划:drive.google.com/file/d/1mIOcEp37n7yRKvkwSZOXybAW6MSq_1qN/…
猜你喜欢
  • 1970-01-01
  • 2013-02-18
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多