sql >> Database >  >> RDS >> Sqlserver

Waarom is een UDF zo veel langzamer dan een subquery?

De UDF is een zwarte doos voor de query-optimizer, dus het wordt voor elke rij uitgevoerd. U doet een rij-voor-rij-cursor. Zoek voor elke rij in een asset drie keer een id op in een andere tabel. Dit gebeurt wanneer u scalaire of multi-statement UDF's gebruikt (in-line UDF's zijn gewoon macro's die uitbreiden naar de buitenste query)

Een van de vele artikelen over het probleem is "Scalaire functies, inlining en prestaties:een vermakelijke titel voor een saaie post".

De subquery's kunnen worden geoptimaliseerd om te correleren en de bewerkingen per rij te vermijden.

Wat je echt wilt is dit:

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

Update februari 2019

SQL Server 2019 begint dit probleem op te lossen.



  1. Foutcode:1406. Gegevens te lang voor kolom - MySQL

  2. MySQL AANTAL ONDERSCHEIDEN

  3. Enkele ideeën over resource pooling op laag niveau in PostgreSQL

  4. Een inleiding tot hoge beschikbaarheid van databases voor MySQL en MariaDB