Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Параметър Sniffing (или Spoofing) в SQL Server

FYI – трябва да сте наясно с нещо друго, когато работите с SQL 2005 и съхранени процеси с параметри.

SQL Server ще компилира плана за изпълнение на съхранената процедура с първия параметър, който се използва. Така че, ако стартирате това:

usp_QueryMyDataByState 'Rhode Island'

Планът за изпълнение ще работи най-добре с данни на малка държава. Но ако някой се обърне и бяга:

usp_QueryMyDataByState 'Texas'

Планът за изпълнение, предназначен за данни с размер на Род Айлънд, може да не е толкова ефективен с данни с размер на Тексас. Това може да доведе до изненадващи резултати при рестартиране на сървъра, тъй като новогенерираният план за изпълнение ще бъде насочен към всеки параметър, който се използва първи - не непременно най-добрият. Планът няма да бъде прекомпилиран, докато няма сериозна причина да го направите, като например, ако статистиката бъде преизградена.

Тук идват плановете за заявки и SQL Server 2008 предлага много нови функции, които помагат на администраторите на база данни да закрепят конкретен план за заявка в дългосрочен план, без значение какви параметри се извикват първи.

Притеснението ми е, че когато възстановихте съхранения си процес, сте принудили плана за изпълнение да се прекомпилира. Извикахте го с любимия си параметър и тогава, разбира се, беше бързо - но проблемът може да не е бил в съхранената процедура. Може да се окаже, че съхранената процедура е била прекомпилирана в някакъв момент с необичаен набор от параметри и по този начин неефективен план за заявка. Може да не сте поправили нищо и може да се сблъскате със същия проблем следващия път, когато сървърът се рестартира или планът за заявка бъде прекомпилиран.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Статистика на базата данни за актуализиране на SQL Server

  2. Рекурсивна заявка на SQL Server

  3. Кога да използвате Common Table Expression (CTE)

  4. 3 начина за конвертиране на HEX в INT в SQL Server (T-SQL)

  5. 5 начина за връщане на редове, които съдържат малки букви в SQL Server