【发布时间】:2014-02-13 20:26:38
【问题描述】:
这是我必须优化的代码,我设法仅使用索引并将其更改为 SUBSTRING 语句的 LIKE 将其降低到起始成本的一半。我现在的问题是最后一行中的子查询和选择中的 SUM 行,我相信我必须通过创建新表或列来摆脱这些但无法完成。
SELECT
C.LastName as Customer , e.LastName as SalesPerson, s.ProductID,
p.Name as ProductName, SUM( s.Quantity ) as quantity,
SUM ( p.Price * s.Quantity ) as amount
FROM dbo.Sales s, dbo.Customers c, dbo.Employees e, dbo.Products p
WHERE
s.CustomerID = c.CustomerID and
s.ProductID = p.ProductID and
s.SalesPersonID = e.EmployeeID and
p.Name like 'Paint%'
GROUP BY C.LastName , e.LastName , s.ProductID, p.Name
HAVING sum ( s.Quantity ) <
(select AVG(s2.Quantity) from dbo.Sales s2 where s2.ProductID=s.ProductID )
欢迎任何帮助,在此先感谢。
【问题讨论】:
-
你用EXPLAIN查看优化方案了吗?不幸的是, HAVING sum() 可能会迫使您阅读很多行。数据重新设计是一种选择吗?是否可以确保此查询很少运行(例如使用 cron 作业)并缓存在文本文件或 sales_volume 表之类的地方?
-
你用的是什么数据库?
-
@TomHaws 你的意思是执行?是的,我做到了,就像你说的那样,HAVING 和子查询给了我整个估计成本的 70%。允许重新设计。它是 SQL Server。
-
我越看这个,越像是一个真正复杂的查询,可能不需要最新的货币。如果需求非常频繁,我认为我的首选解决方案是提供定期缓存的结果。
标签: sql query-optimization having subquery