..
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.
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.
| |
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
Správa open-source databázu. -15% Zľavy až do 06.01.2012. |
| |
Samozrejme databázy a SQL
Vytváranie a správa relačnej databázy. -15% Zľavy až do 06.01.2012. |