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

Има ли разлика в производителността между CTE, подзаявка, временна таблица или таблична променлива?

SQL е декларативен език, а не процедурен език. Това означава, че конструирате SQL израз, за ​​да опишете резултатите, които искате. Вие не казвате на SQL машината как да свърши работата.

Като общо правило е добра идея да оставите SQL машината и SQL оптимизатора да намерят най-добрия план за заявка. Има много хора-години усилия, които се влагат в разработването на SQL машина, така че оставете инженерите да правят това, което знаят как да правят.

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

Колкото до въпроса ти. Производителността на CTE и подзаявките трябва на теория да бъде еднаква, тъй като и двете предоставят една и съща информация на оптимизатора на заявки. Една разлика е, че CTE, използван повече от веднъж, може лесно да бъде идентифициран и изчислен веднъж. След това резултатите могат да се съхраняват и четат многократно. За съжаление SQL Server изглежда не се възползва от този основен метод за оптимизация (може да наречете това често елиминиране на подзаявки).

Временните таблици са различен въпрос, защото вие предоставяте повече насоки за това как трябва да се изпълнява заявката. Една основна разлика е, че оптимизаторът може да използва статистически данни от временната таблица, за да установи своя план за заявка. Това може да доведе до повишаване на производителността. Освен това, ако имате сложна CTE (подзаявка), която се използва повече от веднъж, тогава съхраняването й във временна таблица често ще повиши производителността. Заявката се изпълнява само веднъж.

Отговорът на въпроса ви е, че трябва да поиграете, за да получите очакваната производителност, особено за сложни заявки, които се изпълняват редовно. В идеалния свят оптимизаторът на заявки би намерил перфектния път за изпълнение. Въпреки че често се случва, може да успеете да намерите начин да постигнете по-добра производителност.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Позоваване на псевдоним другаде в списъка SELECT

  2. Използване на merge..output за получаване на съпоставяне между source.id и target.id

  3. Преименувайте чужд ключ в SQL Server с помощта на T-SQL

  4. Първи поглед към новия оценител на мощността на SQL Server

  5. T-SQL Skip Take Stored Procedure