..


Sponzorované odkazy

Optimalizace výkonu T-SQL skript SQL Server

Článek napsal Vincenzo Gaglio
Strana 4 z 4

Prvním řešením je použít JOIN v dotazu přímo přepisovat takto






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



      



 , SC.CustomerType







 Z Sales.Customer SC







 LEFT OUTER JOIN ANO Sales.Individual







 ON = SC.CustomerID SI.CustomerID







 LEFT OUTER JOIN Person.Contact PC







 ON = SI.ContactID PC.ContactID



V této druhé verzi jsem prostě používá tabulky ve funkci getname jejich uvádění v klauzuli FROM. Také jsem nahradil volání funkce getName na seznamu sloupců v příkazu SELECT přímo zřetězením dvou sloupců v tabulce kontakt.

Zde je to, co profiler ukazuje spuštění tohoto dotazu

Jak můžete vidět, naráží na řadu volání z předchozí verze dotazu, nová verze je jeden hovor, což samozřejmě znamená velké úspory z hlediska výkonu.

Nyní se podívejme, co se stane tím, že změní původní skalární funkce getName ve funkci, která vrací tabulku místo (inline tabulka). Za prvé, vytvořit funkci a denominiamola GetNameTable






 CREATE FUNCTION GetNameTable (@ CustomerID int)







 NÁVRAT TABULKA







 AS

 





 (RETURN



  



 SELECT příjmení + "," Jméno + [Customer Name]



  



 Z Sales.Customer SC



  



 LEFT OUTER JOIN ANO Sales.Individual



  



 ON = SC.CustomerID SI.CustomerID



  



 LEFT OUTER JOIN Person.Contact PC



  



 ON = SI.ContactID PC.ContactID

 

  



 KDE CustomerID = @ SC.CustomerID



 



 )



Jak můžete vidět dotazu, který vytáhne data jsou stejná jako u getname skalární funkce, jediný rozdíl je, že funkce vrací tabulku GetNameTable místo hodnoty varchar. Chcete-li použít tuto novou funkci, které používá, je nutné použít CROSS APPLY operátor takto






 SELECT I. [Customer Name]



      



 , SC.CustomerType







 Z Sales.Customer SC







 CROSS APPLY GetNameTable (SC.CustomerID)



V tomto případě je výsledek těchto se Profiler

Podívejme se na poslední příklad toho, jak psát původní dotaz efektivněji. Tentokrát jsme se vytvořit a používat následující názor






 CREATE VIEW View_GetName







 AS



  



 SELECT příjmení + "," Jméno + [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ákladě tohoto pohledu můžeme napsat 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 případě je výsledek Profiler je stejná jako u předchozích dvou příkladech. Tyto tři příklady jsou rovnocenné i když představují malé rozdíly ve výkonu. Nejúčinnější postup je CROSS JOIN což mírně nižší využití procesoru (je vidět z údajů Profiler).

Tyto příklady mají zdůraznit, že použití skalární funkce v seznamu sloupců v příkazu SELECT nebo v klauzuli WHERE, je neefektivní praxe. Negativní účinky této praxe je přímo úměrná množství dat získaných z dotazů, které se používají. Když použitý tímto způsobem, skalární funkce chová jako kurzor, která je volána opakovaně, a poté se zváží se vývoj našich pokynů. Pokud je tedy použit v některé z vašich dotazů za skalární funkce přepsat stejně v jednom z nabízených alternativních.

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

Ti viděli v tomto článku jsou jen některé z možných opatření ke zlepšení výkonnosti našich T-SQL dotazů a dalších užitečných zařízení budou projednány v budoucnu články.

Ve stejné kategorii ...
E-Learning
Kurz MS Access Kurz MS Access
Naučte se vytvářet a spravovat databáze snadno a rychle. Od 29 €.
Kurz MySQL Kurz MySQL
Správa open-source databázi. Od 39 €.
Samozřejmě databáze a SQL Samozřejmě databáze a SQL
Vytváření a správa relační databáze. Od 39 €.
Sponzorované odkazy