sql >> Databasteknik >  >> RDS >> Sqlserver

Tabell värderad funktion som dödar min frågeprestanda

Att returnera en tabellvariabel kommer att göra den till en tabellvärderad funktion med flera påståenden och kan vara dåligt för prestanda på grund av det faktum att det behandlas som en tabell förutom att det inte finns någon statistik tillgänglig för SQL Server att basera en bra exekveringsplan på - så den kommer att uppskatta funktionen som att returnera ett mycket litet antal rader. Om den returnerar ett större antal rader kan därför den genererade planen vara mycket mindre än optimal.

Om du bara returnerar en SELECT gör den till en inline-tabellvärderad funktion - se det mer som en utsikt. I det här fallet tas de faktiska underliggande tabellerna in i huvudfrågan och en bättre utförandeplan kan genereras baserat på korrekt statistik. Du kommer att märka att i det här fallet kommer exekveringsplanen INTE att nämna funktionen alls eftersom den i princip bara har sammanfogat funktionen med huvudfrågan.

Det finns en bra referens om det på MSDN av CSS SQL Server Engineers inklusive (citat):



  1. Få 5 vanligaste värden/förekommande id?

  2. Få topp 10 produkter för varje kategori

  3. pandor - Sammanfogning på strängkolumner fungerar inte (bugg?)

  4. COUNT i en fråga med flera JOINS och en GROUP BY CLAUSE