..
Eine erste Lösung ist die Verwendung von JOIN in der Abfrage direkt, Umschreiben wie folgt
SELECT PC.LastName +''+ PC.FirstName [Customer Name]
, SC.CustomerType
VON Sales.Customer SC
LEFT OUTER JOIN YES Sales.Individual
ON = SC.CustomerID SI.CustomerID
LEFT OUTER JOIN Person.Contact PC
ON = SI.ContactID PC.ContactID
In dieser zweiten Version habe ich einfach die Tabellen in der Funktion GetName man sie in der FROM-Klausel. Habe ich auch die Funktion aufrufen GetName auf die Liste der Spalten in der SELECT-Anweisung durch die direkte Verkettung der beiden Spalten der Tabelle Contact.
Hier ist, was der Profiler diese Abfrage ausführt, zeigt

Wie Sie trotz zahlreicher Anrufe aus der vorherigen Version der Abfrage sehen kann, ist die neue Version einen einzigen Anruf was natürlich bedeutet eine große Einsparung in Bezug auf Leistung.
Nun wollen wir sehen, was passiert, durch die Umwandlung der ursprünglichen Skalarfunktion GetName in eine Funktion, die eine Tabelle zurückgibt statt (inline Tabelle). Erstellen Sie zunächst die Funktion und denominiamola GetNameTable
CREATE FUNCTION GetNameTable (@ CustomerID int) RETURNS TABLE AS (RETURN SELECT LastName + ',' + Vorname [Customer Name] VON Sales.Customer SC LEFT OUTER JOIN YES Sales.Individual ON = SC.CustomerID SI.CustomerID LEFT OUTER JOIN Person.Contact PC ON = SI.ContactID PC.ContactID WHERE CustomerID = @ SC.CustomerID )
Wie Sie die Abfrage, die Daten gleich, dass der skalaren Funktion GetName Auszüge sehen können, ist der einzige Unterschied, dass die Funktion eine Tabelle GetNameTable kehrt anstelle eines varchar-Wert. Um diese neue Funktion nutzt er ist notwendig, um die CROSS APPLY-Operator wie folgt
SELECT I. [Name des Kunden]
, SC.CustomerType
VON Sales.Customer SC
CROSS APPLY GetNameTable (SC.CustomerID) Die
In diesem Fall ist das Ergebnis der folgenden wird Profiler

Nehmen wir ein letztes Beispiel, wie die ursprüngliche Anfrage effizienter zu schreiben. Dieses Mal werden wir erstellen und verwenden Sie die folgende Ansicht
CREATE VIEW View_GetName
AS
SELECT LastName + ',' + Vorname [Customer Name]
, SC.CustomerID
VON Sales.Customer SC
JOIN THE Sales.Individual
ON = SC.CustomerID SI.CustomerID
JOIN Person.Contact PC
ON = SI.ContactID PC.ContactID
GO
Basierend auf dieser Ansicht können wir schreiben unsere Anfrage wie folgt
V. SELECT [Name des Kunden]
, CustomerType
VON Sales.Customer SC
LEFT OUTER JOIN View_GetName V
ON SC.CustomerID CustomerID = R.
In diesem Fall ist das Ergebnis der Profiler ist gleich dem des vorhergehenden zwei Beispiele. Diese drei Beispiele sind gleichwertig, obwohl präsentiert kleine Unterschiede in der Leistung. Der effizienteste Ansatz ist die CROSS JOIN was zu einem etwas geringeren CPU-Auslastung (Sie können aus den Daten der Profiler zu sehen).
Diese Beispiele sollen aufzeigen, dass die Verwendung von skalaren Funktionen in der Liste der Spalten in einer SELECT-Anweisung oder in einer WHERE-Klausel ist eine ineffiziente Praxis. Die negativen Auswirkungen dieser Praxis ist direkt proportional zur Menge der Daten aus den Abfragen, die verwendet werden extrahiert. Wenn in dieser Weise verwendet, verhalten sich die skalare Funktionen wie ein Cursor, der immer wieder genannt wird, und dann beschweren die Entwicklung unserer Anleitung. Wenn also in einigen Ihrer Anfragen genutzt als skalare Funktionen, um das gleiche in einer der vorgeschlagenen Alternative umzuschreiben.
Die in diesem Artikel zu sehen sind nur einige der möglichen Maßnahmen, um die Leistung unserer T-SQL-Abfragen und andere nützliche Geräte zu verbessern, in zukünftigen Artikeln diskutiert werden.
| |
MS Access Course
Erfahren Sie, wie das Erstellen und Verwalten von Datenbanken einfach und schnell. Rabatt -10% bis 2012.06.01. |
| |
Course MySQL
Management von Open-Source-Datenbank. -15% Rabatt bis 2012.06.01. |
| |
Course-Datenbank und SQL
Erstellen und Verwalten von relationalen Datenbanken. -15% Rabatt bis 2012.06.01. |