【发布时间】:2012-04-03 04:30:30
【问题描述】:
我有四张桌子:
-
销售人员 (
personId int ,PersonName nvarchar(20)..) -
personAndDistrict (
autoId int,PersonId int,districtId int):每个在特定地区工作的销售人员 -
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 IS NULL OR par.SalesPersonId = @SalesPersonId对于您 传入特定SalesPersonId的情况可能不是最佳选择(至少除非您在 2008 年并使用OPTION(RECOMPILE)) .表上有哪些索引以及执行计划是什么样的? -
@Martin Smith 忘记了一个讨厌的参数嗅探错误
标签: sql sql-server optimization