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

Използването на променливи в заявка генерира различен план на заявка

Защото, когато използвате ФИКСИРАНИ стойности с изключена АВТОМАТИЧНА ПАРАМЕТРИЗАЦИЯ, тогава планът на заявката знае ТОЧНО за каква стойност трябва да изпълни заявката. Така че планът е настроен СПЕЦИАЛНО към тези стойности.

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

В SQL Server 2008 можете да зададете дали простите параметри да се параметризират автоматично, така че да получавате последователно плана за „най-добър среден случай“ – с всичките му добри и лоши страни.

Справка:

РЕДАКТИРАНЕ - върху производителността

Що се отнася до производителността, оптимизаторът може да се обърка - в този случай той погледна статистиката for the exact values и сметна, че индексът не е полезен (може да е проблем с повратна точка), така че вместо това планът е за клъстерно сканиране. Изящно изкуство е дали да наложите план за заявка - но очевидно използването на индекс е 50% по-бързо за

  1. конкретен хардуер
  2. разпределение на данните за определен момент
  3. дадени са конкретни стойности

Освен ако нямах много добра причина, не бих играл с оптимизатора на заявки (напр. използвайки подсказки за индекс), освен ако нямам много данни, за да докажа, че неизменно ще го направи по-бърз.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете съхранена процедура със schemabinding?

  2. SQL Delete изчиства таблицата вместо грешка

  3. Как да разберем типа данни за география на SQL Server

  4. Могат ли двойни кавички да се използват за ограничаване на низ?

  5. Клаузата OrderBy води до различни набори резултати, когато колоната за поръчка има едни и същи данни