Optimizējot T-SQL skriptu sniegumu SQL Server
Gada 4 4 lapa
1. risinājums ir izmantot JOIN tieši vaicājumā, pārrakstot to šādi
SELECT PC.LastName + ',' + PC.FirstName [Klienta vārds]
, SC.CustomerType
NO Sales.Customer SC
KREISAIS ĀRĒJAIS JOIN JĀ Sales.Individual
PAR = SC.CustomerID SI.CustomerID
KREISAIS ĀRĒJAIS JOIN Person.Contact PC
PAR = SI.ContactID PC.ContactID
Šajā otrajā versijā es vienkārši izmantoja tabulas funkciju GetName ieskaitot tos FROM klauzulu. Es arī aizstāja funkciju zvanu GetName uz sarakstu kolonnām SELECT ko tieši konkatenācijas divas kolonnas iesaistītos Contact tabulā.
Lūk Profiler liecina paraksta šo vaicājumu

Kā jūs varat redzēt priekšā neskaitāmus zvanus no iepriekšējās versijas vaicājuma, jaunā versija ir viens zvans, ka, protams, nozīmē lielu ietaupījumu attiecībā uz kvalitāti.
Paskatīsimies, kas notiek tagad pārvēršot sākotnējo skalāro funkciju GetName ar funkciju, kas atgriež tabulu vietā (inline tabula). Pirmkārt, izveidot funkciju un denominiamola GetNameTable
CREATE FUNKCIJU GetNameTable (@ Klienta int) ATGRIEŠANĀS TABULA AS ATGRIEZTIES ( SELECT Uzvārds + ',' + Vārds [Klienta vārds] NO Sales.Customer SC KREISAIS ĀRĒJAIS JOIN JĀ Sales.Individual PAR = SC.CustomerID SI.CustomerID KREISAIS ĀRĒJAIS JOIN Person.Contact PC PAR = SI.ContactID PC.ContactID SC.CustomerID KUR Klienta = @ )
Kā jūs varat redzēt vaicājumu, kas uzņem dati ir vienāds ar paša skalārā funkcija GetName, vienīgā atšķirība ir tā, ka funkcija atgriež GetNameTable tabulu nevis varchar vērtības. Lai izmantotu šo jauno funkciju, jums ir utilizzario lietot CROSS PIETEIKTIES operatora šādi
SELECT I. [Klienta vārds]
, SC.CustomerType
NO Sales.Customer SC
CROSS PIETEIKTIES GetNameTable panta SC.CustomerID) The
Arī šajā gadījumā no Profiler rezultāts būs šādi

Mēs galīgo piemēru kā rakstīt sākotnējo vaicājumu efektīvāk. Šoreiz mēs radīt un izmantot šādu skatu
CREATE VIEW View_GetName
AS
SELECT Uzvārds + ',' + Vārds [Klienta vārds]
, SC.CustomerID
NO Sales.Customer SC
JOIN Sales.Individual
PAR = SC.CustomerID SI.CustomerID
JOIN Person.Contact PC
PAR = SI.ContactID PC.ContactID
GO
Balstoties uz šo mērķi mēs varam rakstīt mūsu vaicājums šādi
V. SELECT [Klienta vārds]
, CustomerType
NO Sales.Customer SC
LEFT ĀRĒJAIS JOIN View_GetName V
PAR = SC.CustomerID V.CustomerID
Arī šajā gadījumā no Profiler rezultāts būs vienāds ar diviem iepriekšējiem piemēriem. Šie trīs piemēri ir līdzvērtīgi, neskatoties uz to mazo atšķirību rādītājus. Efektīvāka pieeja ir, ka CROSS JOIN, kas nosaka nedaudz zemāku izmantot CPU (jūs varat redzēt no šīs Profiler datiem).
Šie piemēri ir paredzēts uzsvērt, ka no skalārā funkciju sarakstā kolonnu SELECT vai WHERE klauzulas izmantošana ir neefektīva prakse. Negatīvās sekas šīs prakses ir tieši proporcionāls datu daudzumam, kas iegūti no vaicājumiem, kas izmanto. Ja to izmanto šādā veidā skalārā funkcijas uzvesties kā kursors, kas tiek saukta vairākkārt un tāpēc tas sver uz leju apstrādi mūsu norādījumiem. Ja, tāpēc, izmanto kādu no jūsu jautājumiem jāpārraksta skalārs funkcijas jāizskata tādā pašā veidā alternatīva ieteikto.
Tām, kas novērotas šajā rakstā ir tikai daži no iespējamiem pasākumiem, lai uzlabotu sniegumu mūsu T-SQL vaicājumi un citiem noderīgus padomus segs nākamajos pantos.






