..
En første løsning er å bruke BLI i spørringen direkte omskriving som følger
SELECT PC.LastName +''+ PC.FirstName [Customer Name]
, SC.CustomerType
FRA Sales.Customer SC
LEFT Ytre BLI JA Sales.Individual
ON = SC.CustomerID SI.CustomerID
LEFT Ytre BLI Person.Contact PC
ON = SI.ContactID PC.ContactID
I denne andre versjonen bare jeg brukte tabellene i funksjonen GetName sette dem i FROM klausulen. Jeg har også erstattet funksjonen kaller GetName på listen over kolonnene i SELECT-setningen ved direkte sette sammen de to kolonnene til Contact bordet.
Her er hva den profiler viser utføre dette søket

Som du kan se ansiktet til en rekke samtaler fra den forrige versjonen av spørringen, er den nye versjonen en enkelt anrop som selvfølgelig betyr en stor besparelse i form av ytelse.
La oss nå se hva som skjer ved å konvertere den opprinnelige skalar funksjon GetName i en funksjon som returnerer en tabell i stedet (inline tabell). Først oppretter funksjonen og denominiamola GetNameTable
CREATE FUNCTION GetNameTable (@ CustomerID int) RETURNS TABELL AS (RETURN SELECT Etternavn + ',' + Fornavn [Customer Name] FRA Sales.Customer SC LEFT Ytre BLI JA Sales.Individual ON = SC.CustomerID SI.CustomerID LEFT Ytre BLI Person.Contact PC ON = SI.ContactID PC.ContactID HVOR CustomerID = @ SC.CustomerID )
Som du kan se spørringen som trekker ut dataene er lik det skalar funksjon GetName, den eneste forskjellen er at funksjonen returnerer en tabell GetNameTable stedet for en VARCHAR verdi. For å bruke denne nye funksjonen han bruker er nødvendig å bruke CROSS GJELDER operatør som følger
SELECT I. [Customer Name]
, SC.CustomerType
FRA Sales.Customer SC
CROSS GJELDER GetNameTable (SC.CustomerID) Den
I dette tilfellet er resultatet av det følgende vil Profiler

La oss ta et siste eksempel på hvordan å skrive den opprinnelige spørringen mer effektivt. Denne gangen vil vi opprette og bruke følgende syn
CREATE VIEW View_GetName
AS
SELECT Etternavn + ',' + Fornavn [Customer Name]
, SC.CustomerID
FRA Sales.Customer SC
BLI MED PÅ Sales.Individual
ON = SC.CustomerID SI.CustomerID
BLI Person.Contact PC
ON = SI.ContactID PC.ContactID
GO
Basert på dette synet kan vi skrive vår spørring som følger
V. SELECT [Customer Name]
, CustomerType
FRA Sales.Customer SC
LEFT Ytre BLI View_GetName V
PÅ SC.CustomerID CustomerID = R.
I dette tilfellet er resultatet av Profiler er lik som for de to foregående eksemplene. Disse tre eksemplene er likeverdige selv presenterer små forskjeller i ytelse. Den mest effektive tilnærmingen er CROSS BLI resulterer i en noe lavere CPU-bruk (du kan se fra dataene fra Profiler).
Disse eksemplene er ment å markere at bruk av skalare funksjoner i listen over kolonner i en SELECT-setning eller i et WHERE-klausulen er en ineffektiv praksis. De negative effektene av denne praksisen er direkte proporsjonal med mengden av data hentet fra spørringer som brukes. Når den brukes på denne måten, det skalare funksjoner oppføre seg som en markør som kalles gjentatte ganger, og deretter tynge utviklingen av våre instruksjoner. Hvis derfor brukt i noen av dine spørsmål anses skalare funksjoner å skrive det samme i en av de foreslåtte alternativ.
De som har sett i denne artikkelen er bare noen av de mulige tiltak for å forbedre ytelsen av vår T-SQL-spørringer og andre nyttige enheter vil bli diskutert i fremtidige artikler.
| |
MS Access Course
Lær hvordan å opprette og administrere databaser enkelt og raskt. Rabatt -10% frem til 06/01/2012. |
| |
Kurs MySQL
Forvaltning av open-source database. -15% Rabatt frem til 06/01/2012. |
| |
Kurs Database og SQL
Opprette og administrere relasjonsdatabaser. -15% Rabatt frem til 06/01/2012. |