..
O primă soluţie este să folosiţi JOIN în interogare în mod direct, rescrierea după cum urmează
SELECT PC.LastName +''+ PC.FirstName [Nume Client]
, SC.CustomerType
DIN Sales.Customer SC
LEFT JOIN SECUNDAR DA Sales.Individual
ON = SC.CustomerID SI.CustomerID
LEFT JOIN SECUNDAR Person.Contact PC
ON = SI.ContactID PC.ContactID
În această a doua versiune am folosit pur şi simplu în tabelele getName funcţia de punerea lor în clauza FROM. Am înlocuit, de asemenea, getName apel de funcţie pe lista de coloane în instrucţiunea SELECT prin concatenarea direct cele două coloane la tabel de contact.
Iată ce profiler prezinta de executare această interogare

Dupa cum puteti vedea fata de numeroase apeluri de la versiunea anterioară a interogării, noua versiune este un singur apel pe care, desigur, înseamnă o economisire mare în termeni de performanţă.
Acum sa vedem ce se întâmplă prin conversia versiunea originală getName funcţie scalară într-o funcţie care returnează un tabel în loc (tabelul inline). În primul rând, a crea funcţia şi denominiamola GetNameTable
CREATE FUNCTION GetNameTable (@ CustomerID int) REVINE TABELUL AS (RETURN SELECT Nume + ',' + Prenume [Nume Client] DIN Sales.Customer SC LEFT JOIN SECUNDAR DA Sales.Individual ON = SC.CustomerID SI.CustomerID LEFT JOIN SECUNDAR Person.Contact PC ON = SI.ContactID PC.ContactID UNDE de client = @ SC.CustomerID )
După cum puteţi vedea interogarea care extrage date este egală cu cea a getName funcţie scalară, singura diferenţă este că funcţia returnează un GetNameTable tabel în loc de o valoare varchar. Pentru a utiliza această caracteristică nouă el foloseste este necesar să se utilizeze CROSS aplică operatorului, după cum urmează
I. SELECT [Nume Client]
, SC.CustomerType
DIN Sales.Customer SC
CROSS APLICA GetNameTable (SC.CustomerID)
În acest caz, rezultatul cu următorul text va Profiler

Sa luam un exemplu final de modul în care să scrie interogarea originală mai eficient. De data aceasta vom crea şi de a folosi ecranul următoarele
CREATE VIEW View_GetName
AS
SELECT Nume + ',' + Prenume [Nume Client]
, SC.CustomerID
DIN Sales.Customer SC
JOIN Sales.Individual
ON = SC.CustomerID SI.CustomerID
JOIN PC Person.Contact
ON = SI.ContactID PC.ContactID
GO
Bazat pe acest punct de vedere, putem scrie interogare noastre, după cum urmează
V. SELECT [Nume Client]
, CustomerType
DIN Sales.Customer SC
LEFT JOIN SECUNDAR View_GetName V
ON SC.CustomerID de client = R.
În acest caz, rezultatul Profiler este egal cu cel din ultimele două exemple. Aceste trei exemple sunt echivalente, deşi prezintă mici diferenţe în performanţă. Abordarea cea mai eficientă este CROSS JOIN duce la o utilizare CPU uşor mai mică (se poate vedea din datele de Profiler).
Aceste exemple sunt menite să sublinieze faptul că utilizarea de funcţii scalare în lista de coloane într-o instrucţiune SELECT sau într-o clauza WHERE este o practică ineficientă. Efectele negative ale acestei practici este direct proportionala cu cantitatea de date extrase din interogările care sunt utilizate. Atunci când este utilizat în acest fel, funcţii scalare se comporte ca un cursor care este numit în mod repetat, şi apoi se cântăreşte în jos de dezvoltare a instrucţiunilor noastre. Dacă, prin urmare, utilizat în unele dintre întrebările dumneavoastră considerate funcţii scalare pentru a rescrie aceeaşi într-una din alternative propuse.
Cele observate în acest articol sunt doar unele dintre măsurile posibile pentru a îmbunătăţi performanţele noastre T-SQL interogări şi alte dispozitive de utile vor fi discutate în articole viitoare.
| |
MS Access Curs
Aflaţi cum să creaţi şi să gestionaţi baze de date uşor şi rapid. Discount -10% până la 06/01/2012. |
| |
Curs MySQL
De gestionare a bazei de date open-source. -15% Reducere până la 06/01/2012. |
| |
Bază de date curs şi SQL
Crearea şi administrarea bazelor de date relaţionale. -15% Reducere până la 06/01/2012. |