FYI – трябва да сте наясно с нещо друго, когато работите с SQL 2005 и съхранени процеси с параметри.
SQL Server ще компилира плана за изпълнение на съхранената процедура с първия параметър, който се използва. Така че, ако стартирате това:
usp_QueryMyDataByState 'Rhode Island'
Планът за изпълнение ще работи най-добре с данни на малка държава. Но ако някой се обърне и бяга:
usp_QueryMyDataByState 'Texas'
Планът за изпълнение, предназначен за данни с размер на Род Айлънд, може да не е толкова ефективен с данни с размер на Тексас. Това може да доведе до изненадващи резултати при рестартиране на сървъра, тъй като новогенерираният план за изпълнение ще бъде насочен към всеки параметър, който се използва първи - не непременно най-добрият. Планът няма да бъде прекомпилиран, докато няма сериозна причина да го направите, като например, ако статистиката бъде преизградена.
Тук идват плановете за заявки и SQL Server 2008 предлага много нови функции, които помагат на администраторите на база данни да закрепят конкретен план за заявка в дългосрочен план, без значение какви параметри се извикват първи.
Притеснението ми е, че когато възстановихте съхранения си процес, сте принудили плана за изпълнение да се прекомпилира. Извикахте го с любимия си параметър и тогава, разбира се, беше бързо - но проблемът може да не е бил в съхранената процедура. Може да се окаже, че съхранената процедура е била прекомпилирана в някакъв момент с необичаен набор от параметри и по този начин неефективен план за заявка. Може да не сте поправили нищо и може да се сблъскате със същия проблем следващия път, когато сървърът се рестартира или планът за заявка бъде прекомпилиран.