这是我必须优化的代码,我设法将它只用索引的一半开始代价并更改SUBSTRING语句的LIKE。我现在的问题是最后一行的子查询和select中的SUM行,我相信我必须通过创建一个新的表或列来摆脱这些问题,但无法完成。查询优化,(子查询)(sql-transact)
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。 –