[英]Optimizing a SQL query on SQL Server
I have a SQL query on SQL Server that needs to be optimized. 我在SQL Server上有一个需要优化的SQL查询。 It takes almost 16 minutes to run it.
运行它大约需要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
I came up with the following, but it doesn't seems it grabs records that have CountOfActiveSKUs = 0. 我想出了以下内容,但似乎没有抓住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
Any help is appreciated, Thank you! 任何帮助表示赞赏,谢谢!
I would write this as: 我可以这样写:
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;
I would leave the SELECT DISTINCT
out, unless it is absolutely necessary. 除非绝对必要,否则我将不
SELECT DISTINCT
。 If it is necessary, then use an explicit GROUP BY
: 如有必要,请使用显式的
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;
Don't filter the status, count the SKUs with status='A' using a conditional SUM. 不要过滤状态,请使用条件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] First I would re-write original query thus: [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
and 和
[2] Then I would create following index [2]然后我将创建以下索引
CREATE /*UNIQUE*/ /*[NON]CLUSTERED*/ INDEX IUN_SKU_BrandDesc_DeptNo_MfgDesc
ON dbo.SKU (BrandDesc, DeptNo, MfgDesc, Status)
Note #1: IIF(expr, T, F) (SQL2012+) could be replaced with CASE WHEN expr THEN T ELSE F END 注意#1:将IIF(expr,T,F)(SQL2012 +)替换为CASE
Note #2: Check for duplicate / similar indices (on dbo.SKU table) 注意#2:检查重复/相似的索引(在dbo.SKU表上)
Note #3: Index should include also de Status column. 注意#3:索引还应包括“状态”列。
Try this 尝试这个
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.