[英]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.