我有四个表: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