..
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.
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.
| |
Kurs MS Access
Dowiedz się, jak tworzyć i zarządzać bazami danych łatwo i szybko. Począwszy od 29 €. |
| |
Kurs MySQL
Zarządzanie bazą danych open-source. Począwszy od 39 €. |
| |
Baza kursów i SQL
Tworzenie i zarządzanie relacyjnymi bazami danych. Począwszy od 39 €. |