Tsql 为什么SQL参数嗅探会对第一次执行产生负面性能影响?

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,然后执行了存储过程,但每次使用相同的参数值运行第一

我有一个SQL 2005数据库,它与一个应用程序一起分布在大约250个不同的位置。存储过程只在一个位置超时。我发现存储过程中的查询会在SSMS中自行瞬时运行,但存储过程运行需要30秒以上。这让我开始阅读参数嗅探。我读过的文章和论坛解释说,执行计划将根据您第一次运行存储过程时使用的参数值创建,因此对于使用不同参数值的连续运行可能效率低下。有道理。我不明白的是,我已经删除并重新创建了存储过程(甚至尝试了“重新编译”),重新启动了SQL Server,然后执行了存储过程,但每次使用相同的参数值运行第一次和连续运行仍然需要30多秒。更新存储过程以将参数值复制到局部变量确实可以解决此问题,但我不明白为什么我只使用一个值,而所有参数嗅探示例都涉及对参数使用多个值。在这种情况下,当查询本身可以在不到0.01秒的时间内运行时,为什么它会运行缓慢

编辑:

以下是查询:

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.我更改了此示例的名称,但错过了这两个事件。谢谢