..
Pirmasis sprendimas yra naudoti prisijungti prie užklausą tiesiogiai perrašyti taip
PASIRINKITE PC.LastName +''+ PC.FirstName [Kliento vardas]
, SC.CustomerType
IŠ Sales.Customer AB
KAIRĖN IŠORINĖS PRISIJUNK TAIP Sales.Individual
ON = SC.CustomerID SI.CustomerID
KAIRĖN IŠORINĖS PRISIJUNK Person.Contact kompiuterio
ON = SI.ContactID PC.ContactID
Šiuo antroji versija aš tiesiog naudojamas lenteles funkcija getName išleisti juos į IŠ sąlyga. Aš taip pat pakeitė funkcija skambinti getName dėl stulpelius SELECT sąrašą tiesiogiai Sujungę du stulpelius Kontaktai stalo.
Štai ką Profiler rodo, vykdant šią užklausą

Kaip matote daug skambučių iš ankstesnės versijos užklausą veidą, nauja versija yra vieno skambučio, kuri, žinoma, reiškia didelį taupymo atlikimo terminai.
Dabar pažiūrėkime, kas atsitinka, keičiant originalios skaliarinė funkcija getName į funkciją, kuri grąžina lentelės vietoj (inline lentelę). Pirma, sukurti funkciją ir denominiamola GetNameTable
Sukurti funkciją GetNameTable (@ Kliento_ID int) Grąžina LENTELĖ AS (Return SELECT Pavardė + "," + Vardas [Kliento pavadinimas] IŠ Sales.Customer AB KAIRĖN IŠORINĖS PRISIJUNK TAIP Sales.Individual ON = SC.CustomerID SI.CustomerID KAIRĖN IŠORINĖS PRISIJUNK Person.Contact kompiuterio ON = SI.ContactID PC.ContactID KUR Kliento_ID = @ SC.CustomerID )
Kaip matote užklausą, ekstraktai duomenys yra lygi tai skaliarinė funkcija getName, vienintelis skirtumas yra tas, kad funkcija grąžina stalo GetNameTable vietoj VARCHAR vertę. Norėdami naudotis šia nauja funkcija jis naudoja būtina naudoti CROSS TAIKOMI operatorius taip
PASIRINKITE I [Kliento vardas]
, SC.CustomerType
IŠ Sales.Customer AB
KRYŽIAUS TAIKOMI GetNameTable (SC.CustomerID)
Šiuo atveju toks rezultatas bus Profiler

Paimkime galutinis pavyzdys kaip rašyti originalo užklausą efektyviau. Šį kartą mes sukurti ir naudoti šiuos vaizdo
CREATE VIEW View_GetName
AS
SELECT Pavardė + "," + Vardas [Kliento pavadinimas]
, SC.CustomerID
IŠ Sales.Customer AB
PRISIJUNK Sales.Individual
ON = SC.CustomerID SI.CustomerID
PRISIJUNK Person.Contact kompiuterio
ON = SI.ContactID PC.ContactID
GO
Remiantis šiuo požiūriu, mes galime parašyti savo užklausą taip
V. SELECT [Kliento pavadinimas]
, CustomerType
IŠ Sales.Customer AB
KAIRĖN IŠORINĖS PRISIJUNK View_GetName V
APIE SC.CustomerID Kliento_ID = R.
Šiuo atveju Profiler rezultatas yra lygus, kad per praėjusius dvejus pavyzdžiai. Šie trys pavyzdžiai yra lygiaverčiai, nors pateikiant nedidelių skirtumų efektyvumą. Efektyviausias metodas yra CROSS JOIN todėl šiek tiek mažesnis procesoriaus naudojimas (galima pamatyti nuo Profiler duomenis).
Šie pavyzdžiai yra skirti pabrėžti, kad skaliarinis funkcijas naudoti stulpelius SELECT arba WHERE yra neveiksminga praktikoje, sąrašas. Neigiamą šios praktikos yra tiesiogiai proporcingas duomenų, paimtų iš užklausų, kurie yra naudojami sumą. Kai naudojamas tokiu būdu, skaliarinis funkcijas elgiasi kaip žymeklis, kuris yra vadinamas kelis kartus, ir tada prislėgti ir mūsų instrukcijose. Todėl, jei naudojami kai kurie iš jūsų užklausose, skaliarinis funkcijas perrašyti tą patį vienoje iš siūlomų alternatyvų.
Tie matyti šiame straipsnyje, yra tik keletas galimų priemonių, siekiant pagerinti mūsų T-SQL užklausų ir kitų naudingų prietaisų veikimo bus aptarti ateityje straipsniai.
| |
MS Access kursai
Sužinokite, kaip kurti ir valdyti duomenų bazių lengvai ir greitai. Nuolaida -10% iki 2012/06/01. |
| |
Žinoma, MySQL
Valdymas atviro kodo duomenų bazėje. -15% Nuolaida iki 2012/06/01. |
| |
Žinoma, duomenų bazių ir SQL
Kurti ir administruoti reliacinėse duomenų bazėse. -15% Nuolaida iki 2012/06/01. |