Присвоение значений параметров хранимой процедуры локальным переменным для ускорения работы в MS SQL Server 2008
Invite pending
Недавно для меня встала задача оптимизации весьма большой хранимой процедуры в MS SQL Server 2008.
Внутри процедуры было много бизнес логики и лесть туда очень не хотелось, особенно что-то менять.
Тем не менее, собравшись с силами, я скопировал тело процедуры в новый sql-файл для того, чтобы посмотреть что там происходит и познакомиться с процедурой поближе.
Завёл переменные совпадающие по названию с параметрами процедуры.
Потом сделал свою тестовую процедуру для того, чтобы в неё класть запросы из исходной процедуры, и исполнять её на сервере для того, чтобы найти тяжёлые запросы. Тестовая процедура была создана с использованием файла, где были объявлены локальные переменные.
Вот пример ситуации. Исходное состояние процедуры.
Модифицированная процедура:
К моему удивлению процедура стала работать значительно быстрее после такой модификации. К этому я пришёл случайно и ничего не нашёл в интернете по этому поводу.
В результате процедура стала работать около минуты вместо трёх с половиной.
Буду рад узнать логическое объяснение этой ситуации.
Внутри процедуры было много бизнес логики и лесть туда очень не хотелось, особенно что-то менять.
Тем не менее, собравшись с силами, я скопировал тело процедуры в новый sql-файл для того, чтобы посмотреть что там происходит и познакомиться с процедурой поближе.
Завёл переменные совпадающие по названию с параметрами процедуры.
Потом сделал свою тестовую процедуру для того, чтобы в неё класть запросы из исходной процедуры, и исполнять её на сервере для того, чтобы найти тяжёлые запросы. Тестовая процедура была создана с использованием файла, где были объявлены локальные переменные.
Вот пример ситуации. Исходное состояние процедуры.
- CREATE PROCEDURE EstimateInvoice
- @invoiceID bigint,
- @employeeID bigint
- BEGIN
- --BODY
- --@invoiceID и @employeeID используются внутри
- --END BODY
- END
Модифицированная процедура:
- CREATE PROCEDURE EstimateInvoice
- @invoiceID bigint,
- @employeeID bigint
- BEGIN
- DECLARE @paramInvoiceID bigint,
- @paramEmployeeID bigint
- SET @paramInvoiceID = @invoiceID,
- @paramEmployeeID = @employeeID
- --BODY
- --@paramInvoiceID и @paramEmployeeID используются внутри
- --END BODY
- END
К моему удивлению процедура стала работать значительно быстрее после такой модификации. К этому я пришёл случайно и ничего не нашёл в интернете по этому поводу.
В результате процедура стала работать около минуты вместо трёх с половиной.
Буду рад узнать логическое объяснение этой ситуации.