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

Защо UDF е толкова по-бавен от подзаявката?

UDF е черна кутия за оптимизатора на заявки, така че се изпълнява за всеки ред. Правите курсор ред по ред. За всеки ред в актив потърсете идентификатор три пъти в друга таблица. Това се случва, когато използвате скаларни или UDF с множество изрази (вградените UDF са просто макроси, които се разширяват във външната заявка)

Една от многото статии по проблема е „Скаларни функции, вграждане и производителност:Забавно заглавие за скучна публикация“.

Подзаявките могат да бъдат оптимизирани за корелация и избягване на операциите ред по ред.

Това, което наистина искате, е това:

SELECT
   uc.id AS creator,
   uu.id AS updater,
   uo.id AS owner,
   a.[name]
FROM
    asset a
    JOIN
    user uc ON uc.user_pk = a.created_by
    JOIN
    user uu ON uu.user_pk = a.updated_by
    JOIN
    user uo ON uo.user_pk = a.owned_by

Актуализация от февруари 2019 г.

SQL Server 2019 започва да отстранява този проблем.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разбиране на функцията PIVOT в T-SQL

  2. Как да предотвратите автоматичното изключване на SQL Server LocalDB?

  3. Разлика между sys.views, sys.system_views и sys.all_views в SQL Server

  4. Уникалният ключ на Sql Server също ли е индекс?

  5. Вътрешни елементи на SQL Server:Проблемни оператори Pt. II – Хеширане