Tsql 为什么SQL参数嗅探会对第一次执行产生负面性能影响?
我有一个SQL 2005数据库,它与一个应用程序一起分布在大约250个不同的位置。存储过程只在一个位置超时。我发现存储过程中的查询会在SSMS中自行瞬时运行,但存储过程运行需要30秒以上。这让我开始阅读参数嗅探。我读过的文章和论坛解释说,执行计划将根据您第一次运行存储过程时使用的参数值创建,因此对于使用不同参数值的连续运行可能效率低下。有道理。我不明白的是,我已经删除并重新创建了存储过程(甚至尝试了“重新编译”),重新启动了SQL Server,然后执行了存储过程,但每次使用相同的参数值运行第一次和连续运行仍然需要30多秒。更新存储过程以将参数值复制到局部变量确实可以解决此问题,但我不明白为什么我只使用一个值,而所有参数嗅探示例都涉及对参数使用多个值。在这种情况下,当查询本身可以在不到0.01秒的时间内运行时,为什么它会运行缓慢 编辑: 以下是查询:Tsql 为什么SQL参数嗅探会对第一次执行产生负面性能影响?,tsql,sql-server-2005,stored-procedures,database-performance,query-performance,Tsql,Sql Server 2005,Stored Procedures,Database Performance,Query Performance,我有一个SQL 2005数据库,它与一个应用程序一起分布在大约250个不同的位置。存储过程只在一个位置超时。我发现存储过程中的查询会在SSMS中自行瞬时运行,但存储过程运行需要30秒以上。这让我开始阅读参数嗅探。我读过的文章和论坛解释说,执行计划将根据您第一次运行存储过程时使用的参数值创建,因此对于使用不同参数值的连续运行可能效率低下。有道理。我不明白的是,我已经删除并重新创建了存储过程(甚至尝试了“重新编译”),重新启动了SQL Server,然后执行了存储过程,但每次使用相同的参数值运行第一
SELECT bs.pk_EventScheduleID AS EventScheduleID,
bs.EventDate,
bs.EventDate AS [DisplayEventDate],
s.pk_StudentID AS [StudentID],
s.fk_FamilyID AS [FamilyID],
s.FirstName,
s.LastName,
bb.DepositDate,
[Step1],
[Step2],
[Step3],
[Step4],
[Step5],
'Required' AS [DatesType],
bb.IsCancelled
FROM tbl_EventSchedule bs
LEFT JOIN (tbl_EventBooking bb
INNER JOIN tbl_Student s ON bb.fk_StudentID = s.pk_StudentID
INNER JOIN (Select fk_EventBookingID,
[AADA95F3-23AA-40BE-9582-BA3847B88367] AS [Step1],
[F188F8A3-8F3C-429B-8F59-C510E1D94AA8] As [Step2],
[1E493583-3961-4ED0-9388-0D1AC4C0EF32] As [Step3],
[8E5E6B19-A863-4D03-BA97-1A2B86F71506] As [Step4],
[0FE5FDA7-DFEC-4E09-AC63-2805AC562AE3] As [Step5]
FROM (SELECT fk_EventBookingID, RequiredDate, GlobalTypeID
FROM tbl_EventBookingDate
INNER JOIN tbl_EventDateType ON fk_EventDateTypeID = pk_EventDateTypeID) t
PIVOT
(MAX(RequiredDate) FOR GlobalTypeID IN ([AADA95F3-23AA-40BE-9582-BA3847B88367],
[F188F8A3-8F3C-429B-8F59-C510E1D94AA8],
[1E493583-3961-4ED0-9388-0D1AC4C0EF32],
[8E5E6B19-A863-4D03-BA97-1A2B86F71506],
[0FE5FDA7-DFEC-4E09-AC63-2805AC562AE3])) As pvt
) bbdRequired
ON bb.pk_EventBookingID = bbdRequired.fk_EventBookingID
)ON bs.pk_Eventscheduleid = bb.fk_Eventscheduleid
WHERE bs.eventdate > @weekDate
AND bs.isdeleted = 0
AND (bb.pk_EventBookingID IS NULL OR
(
bb.IsDeleted = 0
-- AND bb.IsCancelled = 0
)
)
执行时,第一步是tbl_EventBookingDate和tbl_EventDateType之间最内部的表联接。查看使用存储过程参数与局部变量时执行计划之间的差异
tbl_EventBookingDate共有5635条记录,其中tbl_EventDateType有5条记录。上层执行计划中的3620和4079740恰好是每个表中的记录数X 724。724是tbl_EventSchedule中的记录数,其中bs.eventdate>@weekDate和bs.isdeleted=0。因此,在使用存储过程参数时,似乎对每个tbl_EventSchedule行执行一次内部查询?是否有一个查询计划似乎引用了一个名为“tbl_Event…”的表,而另一个是“tbl_Birth…”的表的原因?@etliens No.我更改了此示例的名称,但错过了这两个事件。谢谢