sql >> Databáze >  >> RDS >> Sqlserver

Proč je UDF mnohem pomalejší než poddotaz?

UDF je černá skříňka optimalizátoru dotazů, takže se provádí pro každý řádek. Provádíte kurzor po řádku. Pro každý řádek v aktivu vyhledejte ID třikrát v jiné tabulce. K tomu dochází, když používáte skalární nebo vícepříkazové UDF (In-line UDF jsou jednoduše makra, která expandují do vnějšího dotazu)

Jedním z mnoha článků o tomto problému je „Skalární funkce, vkládání a výkon:Zábavný název pro nudný příspěvek“.

Dílčí dotazy lze optimalizovat tak, aby korelovaly a vyhnuly se operacím řádek po řádku.

To, co opravdu chcete, je toto:

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

Aktualizace z února 2019

SQL Server 2019 začíná tento problém opravovat.



  1. Multi-DC PostgreSQL:Nastavení pohotovostního uzlu v jiné geografické poloze přes VPN

  2. Převést „datetimeoffset“ na „datetime“ v SQL Server (příklady T-SQL)

  3. SQLite DROP TABLE

  4. Jak vložit řetězec do jiného řetězce na SQL Server pomocí STUFF()