sql >> Database teknologi >  >> RDS >> Sqlserver

Tabel Værdsat funktion dræber min forespørgselsydeevne

At returnere en tabelvariabel vil gøre den til en tabelvurderet funktion med flere sætninger og kan være dårligt for ydeevnen på grund af det faktum, at det behandles som en tabel, bortset fra at der ikke er nogen statistik tilgængelig for SQL Server at basere en god eksekveringsplan på - så den vil estimere funktionen som at returnere et meget lille antal rækker. Hvis den returnerer et større antal rækker, kan den genererede plan derfor være meget mindre end optimal.

Hvorimod at returnere kun en SELECT gør det til en inline tabel værdisat funktion - tænk på det mere som en udsigt. I dette tilfælde bringes de faktiske underliggende tabeller ind i hovedforespørgslen, og en bedre eksekveringsplan kan genereres baseret på korrekt statistik. Du vil bemærke, at i dette tilfælde vil eksekveringsplanen IKKE have en omtale af funktionen overhovedet, da den stort set bare er flettet funktionen ind i hovedforespørgslen.

Der er en god reference til det på MSDN af CSS SQL Server Engineers inklusive (citat):



  1. Mangler ved mysql_real_escape_string?

  2. Ruby / Rails række af strenge til PostgreSQL indsæt

  3. Flyt data fra en MySQL-tabel til en anden

  4. Hvordan kan jeg bestemme strengværdien af ​​Oracles datatype ved dens kode?