Pull to refresh

Присвоение значений параметров хранимой процедуры локальным переменным для ускорения работы в MS SQL Server 2008

Недавно для меня встала задача оптимизации весьма большой хранимой процедуры в MS SQL Server 2008.
Внутри процедуры было много бизнес логики и лесть туда очень не хотелось, особенно что-то менять.


Тем не менее, собравшись с силами, я скопировал тело процедуры в новый sql-файл для того, чтобы посмотреть что там происходит и познакомиться с процедурой поближе.
Завёл переменные совпадающие по названию с параметрами процедуры.
Потом сделал свою тестовую процедуру для того, чтобы в неё класть запросы из исходной процедуры, и исполнять её на сервере для того, чтобы найти тяжёлые запросы. Тестовая процедура была создана с использованием файла, где были объявлены локальные переменные.

Вот пример ситуации. Исходное состояние процедуры.
  1. CREATE PROCEDURE EstimateInvoice
  2.    @invoiceID bigint,
  3.    @employeeID bigint
  4. BEGIN
  5. --BODY
  6. --@invoiceID и @employeeID используются внутри
  7. --END BODY
  8. END

Модифицированная процедура:
  1. CREATE PROCEDURE EstimateInvoice
  2.    @invoiceID bigint,
  3.    @employeeID bigint
  4. BEGIN
  5. DECLARE @paramInvoiceID bigint,
  6. @paramEmployeeID bigint
  7. SET @paramInvoiceID = @invoiceID,
  8.    @paramEmployeeID = @employeeID
  9. --BODY
  10. --@paramInvoiceID и @paramEmployeeID используются внутри
  11. --END BODY
  12. END

К моему удивлению процедура стала работать значительно быстрее после такой модификации. К этому я пришёл случайно и ничего не нашёл в интернете по этому поводу.
В результате процедура стала работать около минуты вместо трёх с половиной.

Буду рад узнать логическое объяснение этой ситуации.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.