這是我必須優化的代碼,我設法將它只用索引的一半開始代價並更改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。 –