繁体   English   中英

在SQL Server上优化SQL查询

[英]Optimizing a SQL query on SQL Server

我在SQL Server上有一个需要优化的SQL查询。 运行它大约需要16分钟。

SELECT DISTINCT DeptNo,
                BrandDesc,
                MfgDesc,
                CountOfActiveSKUs =
                    COALESCE((SELECT COUNT(*)
                                FROM dbo.SKU k
                               WHERE k.Status = 'A'
                                 AND k.BrandDesc = s.BrandDesc
                                 AND k.MfgDesc = s.MfgDesc
                                 AND k.DeptNo = s.DeptNo),
                             0)
           FROM dbo.SKU s
       ORDER BY BrandDesc

我想出了以下内容,但似乎没有抓住CountOfActiveSKUs = 0的记录。

SELECT DISTINCT DeptNo,
                BrandDesc,
                MfgDesc,
                CountOfActiveSKUs = COALESCE(Count(*), 0)
           FROM dbo.SKU
          WHERE Status = 'A'
       GROUP BY BrandDesc, MfgDesc, DeptNo
       ORDER BY BrandDesc

任何帮助表示赞赏,谢谢!

我可以这样写:

SELECT DeptNo, BrandDesc, MfgDesc,
       SUM(CASE WHEN status = 'A' THEN 1 ELSE 0 END) OVER (PARTITION BY BrandDesc, MfgDesc, DeptNo) as CountOfActiveSKUs
FROM dbo.SKU s
ORDER BY BrandDesc;

除非绝对必要,否则我将不SELECT DISTINCT 如有必要,请使用显式的GROUP BY

SELECT DeptNo, BrandDesc, MfgDesc,
       SUM(CASE WHEN status = 'A' THEN 1 ELSE 0 END) as CountOfActiveSKUs
FROM dbo.SKU s
GROUP BY DeptNo, BrandDesc, MfgDesc
ORDER BY BrandDesc;

不要过滤状态,请使用条件SUM计算status ='A'的SKU。

SELECT DISTINCT DeptNo,
                BrandDesc,
                MfgDesc,
                SUM(CASE WHEN status = 'A' THEN 1 ELSE 0 END) as CountOfActiveSKUs
           FROM dbo.SKU
       GROUP BY BrandDesc, MfgDesc, DeptNo
       ORDER BY BrandDesc

[1]首先,我将这样重写原始查询:

SELECT DeptNo, BrandDesc,MfgDesc, SUM(IIF(s.Status = 'A', 0, 1)) AS Count_StatusA
FROM dbo.SKU AS s
GROUP BY s.DeptNo, s.BrandDesc, s.MfgDesc
-- ORDER BY s.BrandDesc -- Uncomment this line only when necessary  

[2]然后我将创建以下索引

CREATE /*UNIQUE*/ /*[NON]CLUSTERED*/ INDEX IUN_SKU_BrandDesc_DeptNo_MfgDesc
ON dbo.SKU (BrandDesc, DeptNo, MfgDesc, Status)

注意#1:将IIF(expr,T,F)(SQL2012 +)替换为CASE

注意#2:检查重复/相似的索引(在dbo.SKU表上)

注意#3:索引还应包括“状态”列。

尝试这个

SELECT s.DeptNo, s.BrandDesc, s.MfgDesc, count(k.Status) as CountOfActiveSKUs
FROM  dbo.SKU s LEFT OUTER JOIN
dbo.SKU k ON 
k.Status = 'A' AND k.BrandDesc = s.BrandDesc
AND k.MfgDesc = s.MfgDesc AND k.DeptNo = s.DeptNo
GROUP BY s.DeptNo, s.BrandDesc, s.MfgDesc
ORDER BY BrandDesc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM