sql >> Databasteknik >  >> RDS >> Sqlserver

Varför är en UDF så mycket långsammare än en underfråga?

UDF är en svart ruta för frågeoptimeraren så den exekveras för varje rad. Du gör en rad-för-rad-markör. För varje rad i en tillgång, slå upp ett id tre gånger i en annan tabell. Det här händer när du använder skalära eller flerpåstående UDF:er (In-line UDF:er är helt enkelt makron som expanderar till den yttre frågan)

En av många artiklar om problemet är "Skalära funktioner, inlining och prestanda:En underhållande titel för ett tråkigt inlägg".

Underfrågorna kan optimeras för att korrelera och undvika rad-för-rad-operationer.

Vad du verkligen vill är detta:

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

Uppdatering februari 2019

SQL Server 2019 börjar åtgärda det här problemet.



  1. Skillnaden mellan sys.objects, sys.system_objects och sys.all_objects i SQL Server

  2. Varför returnerar password_verify falskt?

  3. Att få resultatet av dynamisk SQL till en variabel för sql-server

  4. MySQL konverterar timediff-utdata till formatet dag, timme, minut, sekund