..
On-line kurser
  • Följ oss på Facebook
  • Följ oss på Twitter
  • Följ oss på + Google
  • Följ oss via RSS
  • Följ oss med din Smartphone

Optimera prestanda för T-SQL script i SQL Server

Artikel skriven av Vincenzo Gaglio
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.

(Artikeln fortsätter nedan ...)

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.

Banor
Kurs MS Access Kurs MS Access
Lär dig hur du skapar och hanterar databaser enkelt och snabbt. Start från 39 €.
Kurs MySQL Kurs MySQL
Hantering av öppen källkod databas. Start från 49 €.
Kurs databas och SQL Kurs databas och SQL
Skapa och hantera relationsdatabaser. Start från 39 €.
Se även ...
Annonser

dynastyhomeloan.com

Reklam
Om oss
Kontakta oss
Samarbeta
Disclaimer
© 2003 - 2012 dynastyhomeloan.com - Portalen av den italienska Webmaster - Alla rättigheter reserverade | Powered by Internet Media IKIweb Srl - Piva 02848390122

spring java