【发布时间】:2021-01-10 23:51:22
【问题描述】:
我只是希望您对查询的效率提出意见。我正在通过一个非常大的表(数百万条记录)计算值。这是 MSSQL,但我认为它应该适用于任何数据库引擎。我现在正在做的事情如下:
SELECT Task,
COUNT(*) as Total,
SUM(CASE WHEN Status = 'Active' THEN 1 ELSE 0 END) AS Active,
SUM(CASE WHEN Status = 'Active' AND AppType = 'MOBILE' THEN 1 ELSE 0 END) AS ActiveMobile,
SUM(CASE WHEN Status = 'Active' AND AppType = 'WEB' THEN 1 ELSE 0 END) AS ActiveWeb,
SUM(CASE WHEN Status = 'OnHold' THEN 1 ELSE 0 END) AS onHold,
SUM(CASE WHEN Status = 'onHold' AND AppType = 'MOBILE' THEN 1 ELSE 0 END) AS onHoldMobile,
SUM(CASE WHEN Status = 'onHold' AND AppType = 'WEB' THEN 1 ELSE 0 END) AS onHoldWeb,
SUM(CASE WHEN Status = 'Active' OR Status = 'onHold' THEN 1 ELSE 0 END) AS ActiveAndOnHold,
SUM(CASE WHEN (Status = 'Active' OR Status = 'onHold') AND AppType = 'MOBILE' THEN 1 ELSE 0 END) AS ActiveAndOnHoldMobile,
SUM(CASE WHEN (Status = 'Active' OR Status = 'onHold') AND AppType = 'WEB' THEN 1 ELSE 0 END) AS ActiveAndOnHoldWeb
FROM events
GROUP BY Task;
我意识到我在重新计算同一件事,我应该能够添加部分结果,但老实说,如果不多次遍历表格,我无法弄清楚如何做到这一点。
实际查询还有大约 20 个 SUM 以及相同数据的组合。查询需要一段时间才能运行(大约两个小时)。我想知道是否有更好的方法来做到这一点。
非常欢迎任何建议。
谢谢
【问题讨论】:
-
除了查询优化之外,您还可以查看您的 SQL Server 实例是否还有一些资源,并使用其最大程度的并行性(又名maxdop)。如果它与 0 不同,则可以在查询后添加
option (maxdop x),x是查询计划中每个运算符的最大线程数(0= 无限制)。如果您要在接近生产的任何地方运行它,请密切关注 CPU 和 I/O 负载! -
2 小时!!!数据有多大?在这种情况下,我预计成本主要是
group by的数据移动,而不是sum()s 的数量。 -
谢谢@Sander,我会检查一下。
-
@Gordon Linoff。我希望我知道为什么需要这么长时间。
-
CASE WHEN Status = 'Active' AND Status = 'onHold',如果不是拼写错误,则始终为 false:0 ,,,您可以将查询中已计算的 sum(active)+sum(onhold) (Active, onHold) 添加到获得 active&onhold 的总和.. active(mobile)+onhold(mobile) 等也是如此......
标签: sql sql-server count sum multiple-conditions