我有四個表:SQL Server存儲過程
- 業務員(
personId int ,PersonName nvarchar(20)
..) - personAndDistrict(
autoId int,PersonId int,districtId int
):每一個銷售的人在一個特定的地區工作(S) - PointOfSales(
SalesId int,pointOfSalesId int,districtId int,pointOfSalesName nvarchar(20)
,...)每個地區有很多pointOfSales'。 - DailySales(
SalesPersonId int,SoldAmount float,PointOfSalesId int, salesDate date
,..):每日銷售數據。
爲了節省每天的銷售額爲每一個銷售人員,我需要先顯示一個清單,他銷售的所有點售出量的總和(如果有的話)每個。
因此,我們需要的是顯示特定日期的特定銷售人員的所有銷售點銷售總額。
我有存儲過程:
ALTER PROCEDURE [dbo].[SP_PoinOfSales_GetDataForEntry]
@SalesPersonId int=null, @SalesDate date=null
AS
SELECT DISTINCT
par.SalesPersonId,
pos.pointOfsalesID,
pos.pointOfSalesName,
ISNULL((SELECT SUM(SoldAmount) AS Expr1
FROM
dbo.DailySales AS ds
WHERE
(SalesDate = CONVERT(VARCHAR, @salesDate, 102))
AND (SalesPersonId = par.SalesPersonId)
AND (PointOfsalesID = ps.PointOfsalesID)), 0) AS SoldAmount,
FROM
dbo.PointOfSales AS pos
INNER JOIN
dbo.PersonAndDistrict AS par ON pos.districtId = par.districtId
WHERE
(@SalesPersonId IS NULL
OR par.SalesPersonId = @SalesPersonId)
GROUP BY
pos.districtId,
pos.pointOfSalesName,
pos.PointOfsalesID,
par.SalesPersonId
ORDER BY
pos.PointOfsalesID,
pos.districtId
只返回800條記錄(銷售點的),它會超過6秒!
那麼,如何優化這個存儲過程才能在最短時間內執行?
'@SalesPersonId爲空或par.SalesPersonId = @ SalesPersonId'將可能爲案件次優,你*始終*傳遞一個特定的'SalesPersonId'(至少除非你是在2008年和使用' OPTION(RECOMPILE)')。表上的哪些索引以及執行計劃是什麼樣的? – 2012-04-02 20:19:11
@Martin Smith忘記了參數嗅探錯誤,這是一個討厭的錯誤 – 2012-04-02 20:37:36