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

Защо CTE (Common Table Expressions) в някои случаи забавя заявките в сравнение с временните таблици в SQL Server

Отговорът е лесен.

SQL Server не материализира CTE. Той ги вгражда, както можете да видите от плановете за изпълнение.

Други СУБД могат да го приложат по различен начин, добре известен пример е Postgres, който материализира CTE (по същество създава временни таблици за CTE зад капака).

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

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

От друга страна, в Postgres CTE е „оптимизираща ограда“ и машината не може да прокара предикатите през границата на CTE.

Понякога един начин е по-добър, понякога друг. След като сложността на заявката надхвърли определен праг, оптимизаторът не може да анализира всички възможни начини за обработка на данните и трябва да се спре на нещо. Например редът, в който да се съединят масите. Броят на пермутациите нараства експоненциално с броя на таблиците, от които да избирате. Оптимизаторът има ограничено време за генериране на план, така че може да направи лош избор, когато всички 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. Използване на генериран от база данни GUID и дата и час с EF4

  2. Как мога да конвертирам геометрични данни в географски данни в MS SQL Server 2008?

  3. PHP 7.0 ODBC драйвер за Windows

  4. Как мога да видя всички разрешени специални знаци в полето varchar или char в SQL Server?

  5. Групово вмъкване с параметър за име на файл