..
En første løsning er at bruge JOIN i forespørgslen direkte omskrivning som følger
SELECT PC.LastName +''+ PC.FirstName [Kundens navn]
, SC.CustomerType
FRA SALG.Kunde SC
LEFT OUTER JOIN JA Sales.Individual
ON = SC.CustomerID SI.CustomerID
LEFT OUTER JOIN Person.Contact PC
ON = SI.ContactID PC.ContactID
I denne anden udgave jeg simpelthen brugt tabellerne i funktionen getNavn sætte dem i FROM-udtrykket. Jeg har endvidere erstattet funktionskald getNavn på listen over kolonnerne i SELECT-sætningen ved direkte at sammenkæde de to kolonner til Kontakt bordet.
Her er hvad de profiler viser udfører denne forespørgsel

Som du kan se ansigtet af talrige opfordringer fra den tidligere version af forespørgslen, den nye version er et enkelt opkald hvilket selvfølgelig betyder en stor besparelse i form af funktionsdygtighed.
Lad os nu se hvad der sker ved at konvertere den oprindelige skalarfunktion getNavn i en funktion, der returnerer en tabel i stedet (in-line tabel). Først skal du oprette funktionen og denominiamola GetNameTable
CREATE FUNCTION GetNameTable (@ Kunde-int) ANGIVELSER TABEL AS (RETURN SELECT Efternavn + ',' + Fornavn [Kundens navn] FRA SALG.Kunde SC LEFT OUTER JOIN JA Sales.Individual ON = SC.CustomerID SI.CustomerID LEFT OUTER JOIN Person.Contact PC ON = SI.ContactID PC.ContactID WHERE Kunde = @ SC.CustomerID )
Som du kan se den forespørgsel, der trækker data er lig med, at den skalarfunktion getNavn, den eneste forskel er, at funktionen returnerer en tabel GetNameTable i stedet for en varchar værdi. For at bruge denne nye funktion han bruger er nødvendigt at bruge CROSS GÆLDER operatør som følger
SELECT I. [Kundens navn]
, SC.CustomerType
FRA SALG.Kunde SC
CROSS GÆLDER GetNameTable (SC.CustomerID) Den
I dette tilfælde er resultatet af følgende vil Profiler

Lad os tage et sidste eksempel på, hvordan man skriver den oprindelige forespørgsel mere effektivt. Denne gang vil vi skabe og bruge følgende udsigt
CREATE VIEW View_GetName
AS
SELECT Efternavn + ',' + Fornavn [Kundens navn]
, SC.CustomerID
FRA SALG.Kunde SC
DELTAG I Sales.Individual
ON = SC.CustomerID SI.CustomerID
JOIN Person.Contact PC
ON = SI.ContactID PC.ContactID
GO
Baseret på dette synspunkt kan vi skrive vores forespørgsel som følger
V. SELECT [Kundens navn]
, CustomerType
FRA SALG.Kunde SC
LEFT OUTER JOIN View_GetName V
ON SC.CustomerID Kunde = R.
I dette tilfælde er resultatet af Profiler er lig med, at de to foregående eksempler. Disse tre eksempler kan sidestilles skønt de kan indeholde små forskelle i præstation. Den mest effektive metode er den CROSS JOIN resulterer i et lidt lavere CPU-forbrug (du kan se ud fra oplysningerne i de Profiler).
Disse eksempler har til formål at understrege, at brugen af skalarfunktioner på listen over kolonner i en SELECT-sætning eller i en WHERE klausul er en ineffektiv praksis. De negative virkninger af denne praksis er direkte proportional med mængden af data hentet fra de forespørgsler, der bruges. Når det bruges på denne måde, de skalarfunktioner opføre sig som en markør, der kaldes gentagne gange, og vejes ned for udviklingen af vores anvisninger. Hvis altså, der anvendes i nogle af dine forespørgsler anses skalarfunktioner at omskrive det samme i en af de foreslåede alternativ.
Dem, der ses i denne artikel er blot nogle af de mulige foranstaltninger for at forbedre ydelsen i vores T-SQL-forespørgsler og andre nyttige enheder vil blive drøftet i fremtidige artikler.
| |
MS Access Kursus
Lær, hvordan du opretter og administrerer databaser nemt og hurtigt. Fra 29 €. |
| |
Kursus MySQL
Forvaltning af open source-database. Fra 39 €. |
| |
Kursus Database og SQL
Oprettelse og håndtering af relationelle databaser. Fra 39 €. |