我有一个非常简单的查询,我在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。
提前感谢。
答案 0 :(得分:0)
当您使用Azure SQL数据仓库(ADW)时,您必须采取一些措施才能从这个极其强大的MPP产品中获得良好的性能:
在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
DWU 100是ADW上的最低设置,definitley不适合性能测试。尝试将DWU提升到例如400或1000.对于MPP系统的行数较少的简单查询,任何更多可能都是过度的。请记住,较高的DWU价格昂贵。
不需要NB NOLOCK
,因为READ UNCOMMITTED
是ADW中的默认隔离级别。