..
Prvo rješenje je da koristite se pridruže u upitu izravno, ponovno kako slijedi
SELECT PC.LastName + +''PC.FirstName [Ime kupca]
, SC.CustomerType
IZ Sales.Customer SC
LEFT OUTER JOIN DA Sales.Individual
O = SC.CustomerID SI.CustomerID
LEFT OUTER JOIN Person.Contact računala
O = SI.ContactID PC.ContactID
U ovoj drugoj verziji sam jednostavno koristiti tablice u funkciji GetName stavljajući ih u FROM. Također sam zamijenio GetName funkciju poziva na popisu stupaca u SELECT izjava izravno nadovezivanjem dva stupca u tablici Kontakt.
Evo što Profiler pokazuje izvršenja ovaj upit

Kao što možete vidjeti lice brojnih poziva iz prethodne verzije upita, nova verzija je jedan poziv što naravno znači veliku uštedu u pogledu performansi.
Sada da vidimo što se događa pretvaranjem izvorni GetName skalarne funkcije u funkciju koja vraća tablicu umjesto (Inline tablicu). Prvo, stvoriti funkcije i denominiamola GetNameTable
CREATE FUNCTION GetNameTable (@ CustomerID int) POVRATAK TABLICA AS (Povrat SELECT Prezime + "," + Ime [Ime kupca] IZ Sales.Customer SC LEFT OUTER JOIN DA Sales.Individual O = SC.CustomerID SI.CustomerID LEFT OUTER JOIN Person.Contact računala O = SI.ContactID PC.ContactID GDJE CustomerID = @ SC.CustomerID )
Kao što možete vidjeti upit da ekstrakti podataka jednaka onoj GetName skalarnih funkcija, jedina razlika je u tome što funkcija vraća tablicu GetNameTable umjesto varchar vrijednosti. Da biste koristili ovu novu značajku on koristi potrebno je koristiti CROSS PRIMJENJUJU operatora kako slijedi
SELECT I. [Ime korisnika]
, SC.CustomerType
IZ Sales.Customer SC
CROSS PRIMJENJUJU GetNameTable (SC.CustomerID)
U tom slučaju rezultat sljedeće će Profiler

Pogledajmo konačnu primjer kako napisati izvorni upit učinkovitije. Ovaj put ćemo stvoriti i koristiti sljedeće stajalište
CREATE VIEW View_GetName
AS
SELECT Prezime + "," + Ime [Ime kupca]
, SC.CustomerID
IZ Sales.Customer SC
PRIDRUŽITE Sales.Individual
O = SC.CustomerID SI.CustomerID
PRIDRUŽITE Person.Contact PC
O = SI.ContactID PC.ContactID
GO
Na temelju toga gledišta možemo pisati naše upita kako slijedi
V. SELECT [Ime kupca]
, CustomerType
IZ Sales.Customer SC
LEFT OUTER JOIN View_GetName V
O SC.CustomerID CustomerID = R.
U tom slučaju rezultat Profiler je jednaka onoj od prethodna dva primjera. Ova tri primjera su ekvivalent, iako predstavljaju male razlike u performansama. Najučinkovitiji pristup je CROSS JOIN rezultiralo nešto nižim uporabe procesora (što možete vidjeti iz podataka Profiler).
Ovi primjeri su namijenjeni za istaknuti da korištenje skalarnih funkcija na popisu stupaca u SELECT ili u uvjetu WHERE je neučinkovit praksi. Negativne učinke takve prakse je izravno proporcionalna količini podataka izvađen iz upite koji se koriste. Kada se koristi na ovaj način, skalarne funkcije ponašaju kao kursor koji se zove više navrata, a zatim povijati razvoj naše upute. Ako je, dakle, koristi se u nekim od vaših upita smatra skalarne funkcije prepisati isto u jednoj od predloženih alternativa.
Oni vide u ovom članku, samo su neke od mogućih mjera za poboljšanje performansi naših T-SQL upita i druge korisne uređaja će se raspravljati u budućnosti člancima.
| |
MS Access tečaj
Saznajte kako stvoriti i upravljati bazama podataka jednostavno i brzo. Popust -10% do 2012/06/01. |
| |
Tečaj MySQL
Upravljanje open-source baza podataka. -15% Popusta do 2012/06/01. |
| |
Tečaj Baze podataka i SQL
Stvaranje i upravljanje relacijskim bazama podataka. -15% Popusta do 2012/06/01. |