..
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.
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.
| |
Kurz MS Access
Naučte se vytvářet a spravovat databáze snadno a rychle. Od 29 €. |
| |
Kurz MySQL
Správa open-source databázi. Od 39 €. |
| |
Samozřejmě databáze a SQL
Vytváření a správa relační databáze. Od 39 €. |