Optimera prestanda för T-SQL script i SQL Server
Sidan 4 av 4
En första lösning är att använda GÅ direkt i fråga, omskrivning det följande
VÄLJ PC.LastName + ',' + PC.FirstName [Kundens namn]
, SC.CustomerType
FRÅN Sales.Customer SC
LEFT OUTER JOIN JA Sales.Individual
ON = SC.CustomerID SI.CustomerID
LEFT OUTER JOIN Person.Contact PC
ON = SI.ContactID PC.ContactID
I denna andra version jag använde bara tabellerna i funktionen getName ta med dem i FROM-satsen. Jag ersatte också getName funktionsanrop på listan över kolumner i SELECT genom att direkt sammanfoga de två kolumnerna är inblandade i kontakt tabellen.
Här är vad Profiler visar utför denna fråga

Som du kan se framför otaliga samtal från den tidigare versionen av frågan, är den nya versionen ett enda samtal som uppenbarligen innebär en stor besparing i fråga om prestanda.
Låt oss se vad som händer nu omvandla den ursprungliga getName skalära funktion i en funktion som returnerar en tabell i stället (inline tabell). Först skapar funktionen och denominiamola GetNameTable
CREATE FUNCTION GetNameTable (@ Kundnr int) RETURER TABELL AS RETURN ( VÄLJ Efternamn + ',' + Förnamn [Kundens namn] FRÅN Sales.Customer SC LEFT OUTER JOIN JA Sales.Individual ON = SC.CustomerID SI.CustomerID LEFT OUTER JOIN Person.Contact PC ON = SI.ContactID PC.ContactID SC.CustomerID WHERE Kundnr = @ )
Som du kan se frågan som extraherar data är lika med den skalära funktionen getName är den enda skillnaden att funktionen returnerar GetNameTable ett bord istället för en varchar värde. För att använda denna nya funktionen måste du utilizzario använda CROSS GÄLLER operatör följande
SELECT I. [Kundens namn]
, SC.CustomerType
FRÅN Sales.Customer SC
CROSS GÄLLER GetNameTable (SC.CustomerID) Den
Även i detta fall ett resultat av Profiler kommer att vara följande

Vi gör en sista exempel på hur man skriver den ursprungliga frågan mer effektivt. Denna gång kommer vi att skapa och använda följande vy
Skapa vy View_GetName
AS
VÄLJ Efternamn + ',' + Förnamn [Kundens namn]
, SC.CustomerID
FRÅN Sales.Customer SC
GÅ PÅ Sales.Individual
ON = SC.CustomerID SI.CustomerID
GÅ Person.Contact PC
ON = SI.ContactID PC.ContactID
GÅ
Utifrån detta synsätt kan vi skriva till vår fråga enligt följande
V. SELECT [Kundens namn]
, CustomerType
FRÅN Sales.Customer SC
VÄNSTER OUTER JOIN View_GetName V
ON = SC.CustomerID V.CustomerID
Även i detta fall ett resultat av Profiler kommer att vara lika med den för de tidigare två exemplen. Dessa tre exempel är lika trots sina små skillnader i prestanda. Ju mer effektivt tillvägagångssätt är att CROSS JOIN som avgör en något lägre användning av CPU (du kan se från data i Profiler).
Dessa exempel är avsedda att belysa att användningen av skalära funktioner i listan över kolumner i en SELECT-sats eller i en WHERE-sats är ett ineffektivt praxis. De negativa effekterna av denna metod är direkt proportionell mot mängden data som extraherats från de frågor som använder. När det används på detta sätt skalärfunktioner beter sig som en markör som kallas upprepade gånger och därmed tynger behandling av våra instruktioner. Om därför, som används i några av dina frågor att skriva de skalärfunktioner behandlas på samma sätt som en alternativ föreslås.
De som sett i den här artikeln är bara några av de möjliga åtgärder för att förbättra prestandan på våra T-SQL-frågor och andra användbara tips kommer att behandlas i kommande artiklar.






