Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego UDF jest o wiele wolniejszy niż podzapytanie?

UDF jest czarną ramką dla optymalizatora zapytań, więc jest wykonywany dla każdego wiersza. Robisz kursor wiersz po wierszu. Dla każdego wiersza w zasobie poszukaj identyfikatora trzy razy w innej tabeli. Dzieje się tak, gdy używasz skalarnych lub wieloinstrukcyjnych funkcji UDF (wbudowane UDF to po prostu makra, które rozszerzają się na zewnętrzne zapytanie)

Jednym z wielu artykułów na ten temat jest „Funkcje skalarne, wstawianie i wydajność:zabawny tytuł nudnego posta”.

Podzapytania można zoptymalizować w celu skorelowania i uniknięcia operacji wiersz po wierszu.

To, czego naprawdę chcesz, to:

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

Zaktualizuj luty 2019

SQL Server 2019 zaczyna naprawiać ten problem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Obcięcie SQL Server i ograniczenie 8192

  2. Tymczasowe wyłączenie ograniczeń (MS SQL)

  3. Sprawdź, czy tabela istnieje w SQL Server

  4. EXISTS vs JOIN i użycie klauzuli EXISTS

  5. Jak naprawić „Tylko jedno wyrażenie można określić na liście wyboru…” w SQL Server