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

Какви фактори могат да причинят повторно компилиране на съхранена процедура на SQL Server?

Има няколко начина да осигурите повторно компилиране на съхранена процедура:

  • използване на WITH RECOMPILE ,
  • като съхранената процедура стане динамична (помислете за exec() )
  • маркиране на процедурата за повторно компилиране с sp_recompile .
  • промяна на схемата, на която разчита кеширан план за заявка
  • извикване на DBCC FREEPROCCACHE
  • На ниво заявка отделен израз в рамките на процедура може да бъде прекомпилиран с подсказката за заявка RECOMPILE (SQL 2008).

Фактори при повторно компилиране

Освен изброените по-горе трудни фактори, какво причинява повторно компилиране на съхранена процедура? Е, много неща. Някои от тях са вплетени в списъка по-горе, но искам да ги представя отново b/c, може да не е очевидно.

  • Вмъкване или изтриване на много данни (плътността на данните в индексите и таблиците често контролира плановете за заявки)
  • Преизграждане на индекси (промяна в базовите обекти)
  • Създаване/изтриване на временни таблици (отново, основни DML промени).
  • планът за заявки остаря (мисля, че не е използван наскоро и sql иска да изчисти използването на паметта)

Това в никакъв случай не е изчерпателен списък. Оптимизаторът на заявки се развива и изненадва, независимо колко дълго сте използвали SQL Server. Но ето някои ресурси, които могат да бъдат полезни:

НО ПОЧАКАЙТЕ - ИМА ОЩЕ!

С това казано, презумпцията във вашия въпрос е, че повторното компилиране винаги е лошо за производителността. Всъщност често повторната комплиация е добра.

И така, кога бихте искали да се прекомпилира? Нека да разгледаме един пример за процедура, която търси по фамилия. Съхранените процедури извършват „насочване на параметри ' което е благословия (ако работи за вас) и проклятие (ако работи срещу вас). Първо преминете някой търси на Zebr% за zerbrowski. Индексът на фамилията осъзнава, че това е много специфично и ще върне, да речем, 3 реда от милион -- така че е изграден един план за изпълнение. С процедурата, компилирана за резултат с нисък ред, следващото търсене е за S% . Е, S е вашето най-често срещано име и съвпада с 93 543 реда от 1 милион.



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

  2. Рекурсивен cte sql с ниво на йерархия

  3. SQL Server BCP Експортирайте където запетая в полето SQL

  4. DATETIME2FROMPARTS() Примери в SQL Server (T-SQL)

  5. Агрегирайте побитово-ИЛИ в подзаявка