..


Linki sponsorowane

Optymalizacja wydajności skrypt T-SQL w SQL Server

Artykuł napisany przez Vincenzo Gaglio
Strona 4 z 4

Pierwszym rozwiązaniem jest użycie JOIN w zapytaniu bezpośrednio, przepisywanie w następujący sposób






 SELECT PC.LastName +''+ PC.FirstName [Nazwa klienta]



      



 , SC.CustomerType







 Z Sales.Customer SC







 LEFT OUTER JOIN TAK Sales.Individual







 ON = SC.CustomerID SI.CustomerID







 LEFT OUTER JOIN PC Person.Contact







 ON = SI.ContactID PC.ContactID



W tej drugiej wersji po prostu używane w tabelach w getName funkcji umieszczenie ich w klauzuli FROM. I także zastąpione getName wywołanie funkcji na liście kolumn w instrukcji SELECT, bezpośrednio łącząc dwie kolumny tabeli Contact.

Oto co profiler pokazuje wykonywanie kwerendy

Jak widać obliczu licznych połączeń z poprzedniej wersji zapytania, nowa wersja jest jedno połączenie, co oczywiście oznacza duże oszczędności w zakresie wydajności.

Teraz zobaczmy, co się dzieje, przez przekształcenie pierwotnego getName funkcji skalarnej w funkcję, która zwraca tabelę, zamiast (inline tabela). Najpierw należy utworzyć funkcję i denominiamola GetNameTable






 CREATE FUNCTION GetNameTable (@ CustomerID int)







 TABELA RETURNS







 AS

 





 (RETURN



  



 SELECT Nazwisko + ',' + FirstName [Nazwa klienta]



  



 Z Sales.Customer SC



  



 LEFT OUTER JOIN TAK Sales.Individual



  



 ON = SC.CustomerID SI.CustomerID



  



 LEFT OUTER JOIN PC Person.Contact



  



 ON = SI.ContactID PC.ContactID

 

  



 WHERE CustomerID = @ SC.CustomerID



 



 )



Jak widać kwerendy, która pobiera dane jest równa getName funkcja skalarna, jedyną różnicą jest to, że funkcja zwraca GetNameTable tabeli zamiast wartości varchar. Aby korzystać z tej nowej funkcji, którego używa jest niezbędne do korzystania z CROSS APPLY operator w następujący sposób






 I. SELECT [Nazwa klienta]



      



 , SC.CustomerType







 Z Sales.Customer SC







 CROSS APPLY GetNameTable (SC.CustomerID)



W tym przypadku wynika z następujących będzie Profiler

Weźmy ostatni przykład tego, jak napisać oryginalne zapytanie bardziej efektywnie. Tym razem będziemy tworzyć i używać następujących widzenia






 CREATE VIEW View_GetName







 AS



  



 SELECT Nazwisko + ',' + FirstName [Nazwa klienta]



        



 , SC.CustomerID

 

  



 Z Sales.Customer SC



  



 DOŁĄCZ Sales.Individual



  



 ON = SC.CustomerID SI.CustomerID



  



 DOŁĄCZ DO PC Person.Contact



  



 ON = SI.ContactID PC.ContactID







 GO



Na podstawie tego punktu widzenia możemy zapisać nasze zapytanie w następujący sposób






 V. SELECT [Nazwa klienta]

 

      



 , CustomerType







 Z Sales.Customer SC







 LEFT OUTER JOIN View_GetName V







 ON SC.CustomerID CustomerID = R.



W tym przypadku wynik Profiler równa się z dwóch poprzednich przykładów. Te trzy przykłady są równoważne chociaż wiążą się niewielkie różnice w wydajności. Najbardziej efektywnym podejściem jest CROSS JOIN w wyniku nieco niższe zużycie procesora (widać z danych Profiler).

Te przykłady mają na celu podkreślenie, że korzystanie z funkcji skalarnych na liście kolumn w instrukcji SELECT, lub w klauzuli WHERE jest nieefektywne praktyki. Negatywnych skutków tej praktyki jest wprost proporcjonalna do ilości danych pochodzących z kwerend, które są używane. Przy stosowaniu w ten sposób funkcji skalarnych zachowywać się jak kursor, który nazywa się wielokrotnie, a następnie obciąża rozwoju naszej instrukcji. Jeśli zatem używane w niektórych zapytań za funkcje skalarne przepisać tym samym w jednym z proponowanych alternatywnych.

(Artykuł w dalszym ciągu poniżej ...)

Obserwowanych w tym artykule to tylko niektóre z możliwych środków w celu poprawy wydajności naszego T-SQL zapytań i innych urządzeń przydatnych zostaną omówione w kolejnych artykułach.

W tej samej kategorii ...
E-Learning
Kurs MS Access Kurs MS Access
Dowiedz się, jak tworzyć i zarządzać bazami danych łatwo i szybko. Począwszy od 29 €.
Kurs MySQL Kurs MySQL
Zarządzanie bazą danych open-source. Począwszy od 39 €.
Baza kursów i SQL Baza kursów i SQL
Tworzenie i zarządzanie relacyjnymi bazami danych. Począwszy od 39 €.
Linki sponsorowane