SQL server 2012 gespeicherte Prozedur läuft langsam

Ich habe eine SQL server gespeicherte Prozedur und es läuft gut auf SQL server 2008 R2.

Wenn ich versuche, es auf SQL server 2012 laufen, dauert es sehr lange time zu laufen.

Aber wenn ich lokale variables innerhalb der gespeicherten Prozedur schaffe und die Werte der Eingabeparameter in diese lokalen variables kopiere und sie anstelle von Eingabeparametern verwende, werden Abfrageläufe und Retouren schneller als in SQL server 2008 R2 database (bitte beachten Sie beide 2008 R2 und 2012 server laufen auf demselben Feld).

Könnten Sie bitte ein Licht auf, was hier los ist?

Durch das Erstellen lokaler variables und Rebinding-Werte deaktivieren Sie die Parameter-Sniffing :

Parameter Sniffing ist der process, bei dem SQL server einen optimalen Plan für eine gespeicherte Prozedur erstellt, indem er die aufrufenden Parameter verwendet, die beim ersten Ausführen einer gespeicherten Prozedur übergeben werden

Jeder nachfolgende Aufruf der gleichen memoryprozedur mit den gleichen Parametern erhält auch einen optimalen Plan, wohingegen Anrufe mit unterschiedlichen Parameterwerten nicht immer einen optimalen Plan erhalten können

Lauf verlängert:

CREATE PROC [dbo].[DisplayBillingInfo] @BeginDate DATETIME, @EndDate DATETIME AS BEGIN SELECT BillingDate, BillingAmt FROM BillingInfo WHERE BillingDate between @StartDate AND @StopDate; END 

Führen Sie schnell aus (weil es jedes Mal einen neuen Ausführungsplan berechnen muss):

 CREATE PROC [dbo].[DisplayBillingInfo] @BeginDate DATETIME, @EndDate DATETIME AS BEGIN DECLARE @StartDate DATETIME = @BeginDate; DECLARE @StopDate DATETIME = @EndDate; SELECT BillingDate, BillingAmt FROM BillingInfo WHERE BillingDate between @StartDate AND @StopDate; END 

Der Fall ist, dass der SQL server-Optimierer den Cache-Plan nicht wiederverwenden und ihn jedes Mal auswerten kann.

Dies ist das gleiche wie Sie mit WITH RECOMPILE :

 CREATE PROC [dbo].[DisplayBillingInfo] @BeginDate DATETIME, @EndDate DATETIME WITH RECOMPILE AS BEGIN SELECT BillingDate, BillingAmt FROM BillingInfo WHERE BillingDate between @StartDate AND @StopDate; END 

mit Abfrage Hinweis:

 CREATE PROC [dbo].[DisplayBillingInfo] @BeginDate DATETIME, @EndDate DATETIME AS BEGIN SELECT BillingDate, BillingAmt FROM BillingInfo WHERE BillingDate between @StartDate AND @StopDate OPTION(RECOMPILE); -- OPTION (OPTIMIZE FOR (@StartDate UNKNOWN, @StopDate UNKNOWN)) END