Azure DB DTU占满触发超时 如何重构优化现有存储过程SQL语句
存储过程优化建议
- 修复变量声明笔误:原代码中第二个COUNT查询赋值的变量为
@trialing,但预先声明的是@secondValue,存在未声明变量的语法问题,会导致执行异常。 - 合并两次独立查询为单次条件聚合查询,避免两次扫描全表,减少一半的IO开销:
原代码的两个查询过滤条件仅Type字段取值不同,其余过滤条件完全一致,可以用CASE WHEN在同一次表扫描中完成两个计数的统计,优化后的SQL如下:DECLARE @value BIGINT DECLARE @secondValue BIGINT SELECT @value = COUNT(CASE WHEN [Type] = 'paid' THEN 1 END), @secondValue = COUNT(CASE WHEN [Type] = 'avalue' THEN 1 END) FROM [dbo].[myTable] WHERE [Name] = 'something' AND profilestatus = 'something' AND ExpiresOn >= CURRENT_TIMESTAMP AND [Type] IN ('paid','avalue') -- 提前过滤仅需要的Type值,减少数据处理量 SELECT @value as firstValue, @secondValue as secondValue - 新增覆盖索引消除全表扫描,完全命中索引即可返回结果,大幅降低DTU占用:
针对查询的过滤字段和统计逻辑,创建如下非聚集索引,不需要回表查询聚簇索引即可完成计数:
索引顺序说明:等值匹配的CREATE NONCLUSTERED INDEX IX_myTable_Name_ProfileStatus_Type_ExpiresOn ON dbo.myTable ([Name], profilestatus, [Type], ExpiresOn)Name、profilestatus放在最前面,随后放同样是等值过滤的Type,最后放范围匹配的ExpiresOn,符合索引最左匹配原则,查询效率最高。
内容的提问来源于stack exchange,提问作者Funky
相关产品推荐
相关产品推荐

