..
Een eerste oplossing is het gebruik van direct JOIN in de query, herschrijven als volgt
SELECT PC.LastName +''+ PC.FirstName [klantnaam]
, SC.CustomerType
VAN Sales.Customer SC
LEFT OUTER JOIN JA Sales.Individual
ON = SC.CustomerID SI.CustomerID
LEFT OUTER JOIN Person.Contact PC
ON = SI.ContactID PC.ContactID
In deze tweede versie ik gewoon de tabellen gebruikt worden in de functie getName ze in de FROM-component. Ik heb ook vervangen door de functie-aanroep getName op de lijst van kolommen in de SELECT-instructie door rechtstreeks het samenvoegen van de twee kolommen aan de Contact tafel.
Hier is wat de profiler toont het uitvoeren van deze query

Zoals je kunt zien het gezicht van de vele verzoeken van de vorige versie van de query, de nieuwe versie is een gesprek wat natuurlijk betekent een grote besparing in termen van prestaties.
Laten we nu eens zien wat er gebeurt door het omzetten van de oorspronkelijke scalaire functie getName in een functie die een tabel terug in plaats daarvan (inline tabel). Maak eerst de functie en denominiamola GetNameTable
CREATE FUNCTION GetNameTable (@ KlantId int) RENDEMENTEN TAFEL AS (RETURN SELECT Achternaam + ',' + Voornaam [klantnaam] VAN Sales.Customer SC LEFT OUTER JOIN JA Sales.Individual ON = SC.CustomerID SI.CustomerID LEFT OUTER JOIN Person.Contact PC ON = SI.ContactID PC.ContactID WHERE KlantId = @ SC.CustomerID )
Zoals je kunt zien dat de query haalt de gegevens is gelijk aan die van de scalaire functie getName, het enige verschil is dat de functie een tafel GetNameTable plaats rendement van een varchar waarde. Voor het gebruik van deze nieuwe functie die hij gebruikt is het noodzakelijk het gebruik van de CROSS operator als volgt toegepast
SELECT I. [klantnaam]
, SC.CustomerType
VAN Sales.Customer SC
CROSS VAN TOEPASSING GetNameTable (SC.CustomerID) De
In dit geval is het resultaat van de volgende zal Profiler

Laten we eens een laatste voorbeeld van hoe de oorspronkelijke query schrijven efficiënter. Deze keer zullen we creëren en gebruik de volgende te bekijken
CREATE VIEW View_GetName
AS
SELECT Achternaam + ',' + Voornaam [klantnaam]
, SC.CustomerID
VAN Sales.Customer SC
DOE MEE AAN DE Sales.Individual
ON = SC.CustomerID SI.CustomerID
JOIN Person.Contact PC
ON = SI.ContactID PC.ContactID
GO
Op basis van deze visie kunnen we schrijven onze query als volgt
V. SELECT [klantnaam]
, CustomerType
VAN Sales.Customer SC
LEFT OUTER JOIN View_GetName V
ON SC.CustomerID KlantId = R.
In dit geval is het resultaat van de Profiler is gelijk aan die van de vorige twee voorbeelden. Deze drie voorbeelden zijn gelijkwaardig, maar de presentatie van kleine verschillen in prestaties. De meest efficiënte aanpak is het CROSS JOIN resulteert in een iets lager CPU-gebruik (je kunt zien op de gegevens van de Profiler).
Deze voorbeelden zijn bedoeld om te benadrukken dat het gebruik van scalaire functies in de lijst van kolommen in een SELECT-instructie of in een WHERE clausule is een inefficiënte praktijk. De negatieve gevolgen van deze praktijk is recht evenredig met de hoeveelheid gegevens die uit de query's die worden gebruikt. Wanneer op deze manier gebruikt, de scalaire functies zich gedragen als een cursor die herhaaldelijk wordt genoemd, en weeg het vervolgens op de ontwikkeling van onze instructies. Wanneer dus, gebruikt in een aantal van uw vragen als scalaire functies op hetzelfde herschrijven in een van de voorgestelde alternatief.
Die werden gezien in dit artikel zijn slechts enkele van de mogelijke maatregelen om de prestaties van onze T-SQL-query's en andere nuttige apparaten te verbeteren zal worden besproken in toekomstige artikelen.
| |
MS Access Cursus
Leer hoe het maken en beheren van databanken gemakkelijk en snel. Korting -10% tot 06/01/2012. |
| |
Cursus MySQL
Beheer van de open source database. -15% Korting tot 06/01/2012. |
| |
Cursus Database en SQL
Het creëren en beheren van relationele databases. -15% Korting tot 06/01/2012. |