..


Sponzorované odkazy

Optimalizácia výkonu T-SQL skript SQL Server

Článok napísal Vincenzo Gaglio
Strana 4 z 4

Prvým riešením je použiť JOIN v dotaze priamo prepisovať takto






 SELECT PC.LastName +''+ PC.FirstName [Customer Name]



      



 , SC.CustomerType







 Z Sales.Customer SC







 LEFT OUTER JOIN ÁNO Sales.Individual







 ON = SC.CustomerID SI.CustomerID







 LEFT OUTER JOIN Person.Contact PC







 ON = SI.ContactID PC.ContactID



V tejto druhej verzii som jednoducho používa tabuľky vo funkcii getname ich uvádzanie v klauzule FROM. Tiež som nahradil volanie funkcie getName na zozname stĺpcov v príkaze SELECT priamo zřetězením dvoch stĺpcov v tabuľke kontakt.

Tu je to, čo Profiler ukazuje spustenie tohto dopytu

Ako môžete vidieť, naráža na rad volanie z predchádzajúcej verzie dotazu, nová verzia je jeden hovor, čo samozrejme znamená veľké úspory z hľadiska výkonu.

Teraz sa pozrime, čo sa stane tým, že zmení pôvodné skalárne funkcie getName vo funkcii, ktorá vracia tabuľku miesto (inline tabuľka). Po prvé, vytvoriť funkciu a denominiamola GetNameTable






 CREATE FUNCTION GetNameTable (@ CustomerID int)







 NÁVRAT TABUĽKA







 AS

 





 (RETURN



  



 SELECT priezvisko + "," Meno + [Customer Name]



  



 Z Sales.Customer SC



  



 LEFT OUTER JOIN ÁNO Sales.Individual



  



 ON = SC.CustomerID SI.CustomerID



  



 LEFT OUTER JOIN Person.Contact PC



  



 ON = SI.ContactID PC.ContactID

 

  



 KDE CustomerID = @ SC.CustomerID



 



 )



Ako môžete vidieť dotazu, ktorý vytiahne dáta sú rovnaké ako u getname skalárne funkcie, jediný rozdiel je, že funkcia vracia tabuľku GetNameTable namiesto hodnoty varchar. Ak chcete použiť túto novú funkciu, ktoré používa, je nutné použiť CROSS APPLY operátor takto






 SELECT I. [Customer Name]



      



 , SC.CustomerType







 Z Sales.Customer SC







 CROSS APPLY GetNameTable (SC.CustomerID)



V tomto prípade je výsledok týchto sa Profiler

Pozrime sa na posledný príklad toho, ako písať pôvodnú otázku efektívnejšie. Tentoraz sme sa vytvoriť a používať nasledujúce názor






 CREATE VIEW View_GetName







 AS



  



 SELECT priezvisko + "," Meno + [Customer Name]



        



 , SC.CustomerID

 

  



 Z Sales.Customer SC



  



 JOIN Sales.Individual



  



 ON = SC.CustomerID SI.CustomerID



  



 JOIN Person.Contact PC



  



 ON = SI.ContactID PC.ContactID







 GO



Na základe tohto pohľadu môžeme napísať náš dotaz takto






 V. SELECT [Customer Name]

 

      



 , CustomerType







 Z Sales.Customer SC







 LEFT OUTER JOIN View_GetName V







 O SC.CustomerID CustomerID = R.



V tomto prípade je výsledok Profiler je rovnaká ako u predchádzajúcich dvoch príkladoch. Tieto tri príklady sú rovnocenné aj keď predstavujú malé rozdiely vo výkone. Najúčinnejšia postup je CROSS JOIN čo mierne nižšie využitie procesora (je vidieť z údajov Profiler).

Tieto príklady majú zdôrazniť, že použitie skalárne funkcie v zozname stĺpcov v príkaze SELECT alebo v klauzule WHERE, je neefektívne praxe. Negatívne účinky tejto praxe je priamo úmerná množstvu dát získaných z otázok, ktoré sa používajú. Keď použitý týmto spôsobom, skalárne funkcie chová ako kurzor, ktorá je volaná opakovane, a potom sa odvážte vývoj našich pokynov. Ak je teda použitý v niektorej z vašich otázok za skalárne funkcie prepísať rovnako v jednom z ponúkaných alternatívnych.

(Článok pokračuje pod ...)

Tí videli v tomto článku sú len niektoré z možných opatrení na zlepšenie výkonnosti našich T-SQL dotazov a ďalších užitočných zariadení budú prerokované v budúcnosti články.

V rovnakej kategórii ...
E-Learning
Kurz MS Access Kurz MS Access
Naučte sa vytvárať a spravovať databázy jednoducho a rýchlo. Zľava -10% do 06.01.2012.
Kurz MySQL Kurz MySQL
Správa open-source databázu. -15% Zľavy až do 06.01.2012.
Samozrejme databázy a SQL Samozrejme databázy a SQL
Vytváranie a správa relačnej databázy. -15% Zľavy až do 06.01.2012.
Sponzorované odkazy