【问题标题】:Slow running query in Azure SQL Data WarehouseAzure SQL 数据仓库中运行缓慢的查询
【发布时间】:2017-08-16 07:37:47
【问题描述】:

我有一个非常简单的查询,我正在 Azure SQL 数据仓库中运行,但它需要大约 40 秒才能执行。

表定义:

CREATE TABLE dbo.orders 
  ( 
     location_code     VARCHAR(8) NOT NULL, 
     order_date        DATETIME NOT NULL, 
     order_status_code INT NOT NULL, 
     order_type_code   VARCHAR(1) NULL, 
     coupon_code       VARCHAR(8) NULL, 
     coupon_amount     MONEY NOT NULL, 
     subtotal          MONEY NOT NULL, 
     total_amount      MONEY NULL, 
     order_number      INT NOT NULL, 
     customer_code     INT NOT NULL 
  )
 WITH
 (
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
)

查询是:

SELECT location_code, 
       order_date, 
       order_status_code, 
       order_type_code, 
       coupon_code, 
       coupon_amount, 
       subtotal, 
       total_amount, 
       order_number, 
       customer_code 
FROM   orders WITH (nolock) 
WHERE  order_date >= '2016-04-01' 
       AND order_date <= '2016-04-30' 
       AND order_status_code < 99 

表中有 13,083,667 条记录。任何人都可以帮助我优化这个。我为此提供了 100 个 DWU。

提前致谢。

【问题讨论】:

  • 在 ssms 中,右键单击表并“将其编写为创建到新查询窗口的脚本”。也请发布该脚本,以便我们可以看到表 def 和索引
  • 也共享执行计划,表中的行数
  • 你好 caius,请在下面找到表的结构:创建表 Orders( [Location_Code] [varchar](8) NOT NULL,[Order_Date] [datetime] NOT NULL,[Order_Status_Code] [int] NOT NULL,[Order_Type_Code] [varchar](1) NULL,[Coupon_Code] [varchar](8) NULL, [Coupon_Amount] [money] NOT NULL,[SubTotal] [money] NOT NULL,[Total_Amount] [money] NULL ,[Order_Number] [int] NOT NULL,[Customer_Code] [int] NOT NULL) WITH(DISTRIBUTION = ROUND_ROBIN,CLUSTERED COLUMNSTORE INDEX)
  • @thegameiswar 表中的行数为 13083667。
  • @Deepanshu:请看这个链接,了解如何改进问题:spaghettidba.com/2015/04/24/…

标签: sql azure azure-sql-database sql-data-warehouse


【解决方案1】:

当您使用 Azure SQL 数据仓库 (ADW) 时,您必须做一些事情才能从这个非常强大的 MPP 产品中获得良好的性能:

1. 创建统计数据

统计信息不会在 ADW 中自动创建,因此您必须创建它们。至少,在连接、WHERE 子句、GROUP BY 和 HAVING 中使用的所有列上创建它们。查询的示例统计信息:

CREATE STATISTICS stat_dbo__orders__order_date ON dbo.orders ( order_date );
CREATE STATISTICS stat_dbo__orders__order_status_code ON dbo.orders ( order_status_code );

阅读这篇关于该主题的内容丰富的文章:

管理 SQL 数据仓库中表的统计信息

https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-tables-statistics

2. DWU

DWU 100 是 ADW 和 definitley 上的最低设置,不适合性能测试。尝试将 DWU 提高到例如 400 或 1000。对于 MPP 系统的这种带有少量行的简单查询,任何更多可能都是多余的。请记住,较高的 DWU 价格昂贵。

注意NOLOCK 不是必需的,因为READ UNCOMMITTED 是 ADW 中的默认隔离级别。

【讨论】:

  • 我之前创建了统计信息,但性能没有提高。我也将 DMU 从 100 提高到 400 和 1000 但没有白费,性能仍然相同。
  • 你能提供一些样本数据和它是如何分布的想法吗?例如,您有 1,2 5 年的数据等吗?我创建了一个simple repro script 并且无法重现它。会不会有其他事情发生?例如,是否有任何其他用户登录运行工作负载? ADW 确实具有非常低的并发性,特别是在较低的 DWU 中,例如 DWU 400 的最大并发查询数仅为 16。将单词 EXPLAIN 放在查询前面并发布生成的 XML。这可能会有所启发。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 2016-09-01
  • 1970-01-01
  • 2017-01-03
  • 2017-09-15
  • 2019-08-02
  • 2017-09-22
  • 2019-06-19
相关资源
最近更新 更多