Создавая локальные переменные и значения пересвязывание отключить parameter sniffing:
нюхают
Параметр является процесс, при котором SQL Server создает оптимальный план для хранимой процедуры с помощью параметры вызова , которые будут приняты в первый раз выполняется хранимая процедура
Каждый последующий вызов той же процедуры хранения с теми же параметрами также получит оптимальный план, , тогда как вызовы с различным параметром эр значения не всегда могут получить оптимальный план
Run замедляется:
CREATE PROC [dbo].[DisplayBillingInfo]
@BeginDate DATETIME,
@EndDate DATETIME
AS
BEGIN
SELECT BillingDate, BillingAmt
FROM BillingInfo
WHERE BillingDate between @StartDate AND @StopDate;
END
Run быстро (потому что он должен рассчитать новый план каждый раз):
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
Дело оптимизатор SQL Server не может повторно использовать кешированный план и оценивать его каждый раз.
Это то же самое, как вы используете 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
используя подсказку запроса:
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
Должно быть на DBA.se, так как это не программирование вопрос. – cybermonkey