Fünf Möglichkeiten zur Steigerung Ihrer SQL-Leistung
Dieser Artikel ist ein Auszug aus dem MSDN-Artikel „Fünf Möglichkeiten zur Verbesserung der SQL-Leistung“ und schlägt vor, wie Sie die Betriebseffizienz von SQL Server-basierten Anwendungen verbessern können. Er wird dringend empfohlen. Für einige Anwendungssysteme mit hohem Datenverkehr ist die Verbesserung und Verbesserung von SQL-Anweisungen sehr wichtig und ein guter Durchbruchspunkt.
*Der Artikel enthält hauptsächlich die folgenden Inhalte (bei Interesse besuchen Sie bitte direkt die folgende URL, um das vollständige chinesische und englische Dokument zu lesen):
1. Geben Sie IDENTITY von INSERT zurück
SELECT @@IDENTITY
2, eingebettete Ansicht und temporäre Tabelle
Temporäre Tabellen – Temporäre Tabellen in tempdb können dazu führen, dass Abfragen umfangreiche E/A-Vorgänge und Festplattenzugriffe ausführen, und temporäre Tabellen können viele Ressourcen verbrauchen.
Inline-Ansichten – Verwenden Sie Inline-Ansichten anstelle von temporären Tabellen. Eine Inline-Ansicht ist einfach eine Abfrage, die in der FROM-Klausel verknüpft werden kann. Wenn Sie nur Daten mit anderen Abfragen verknüpfen müssen, können Sie versuchen, Inline-Ansichten zu verwenden, um Ressourcen zu sparen.
3. Vermeiden Sie LEFT JOIN und NULL
LEFT JOINs sind sehr ressourcenintensiv, da sie Daten enthalten, die mit NULL-Daten (nicht vorhandenen) übereinstimmen. In manchen Fällen ist dies unvermeidbar, die Kosten können jedoch sehr hoch sein. LEFT JOIN verbraucht mehr Ressourcen als INNER JOIN. Wenn Sie also die Abfrage so umschreiben können, dass sie keinen LEFT JOIN verwendet, erhalten Sie eine sehr gute Belohnung.
Eine Technik zur Beschleunigung von Abfragen, die LEFT JOIN verwenden, besteht darin, einen TABLE-Datentyp zu erstellen, alle Zeilen in die erste Tabelle (die Tabelle links vom LEFT JOIN) einzufügen und dann den TABLE-Datentyp mit den Werten von zu aktualisieren der zweite Tisch. Diese Technik ist ein zweistufiger Prozess, kann jedoch im Vergleich zu einem standardmäßigen LEFT JOIN viel Zeit sparen. Eine gute Regel besteht darin, verschiedene Techniken auszuprobieren und die jeweils erforderliche Zeit aufzuzeichnen, bis Sie die Abfrage erhalten, die für Ihre Anwendung die beste Leistung erbringt.
DECLARE @tblMonths TABLE (sMonth VARCHAR(7))
4, flexible Verwendung des kartesischen Produkts
Ich werde ausführlich auf diese Technik eingehen und in einigen Fällen die Verwendung kartesischer Produkte befürworten. Aus irgendeinem Grund stoßen kartesische Produkte (CROSS JOIN) auf große Kritik, und Entwickler werden häufig davor gewarnt, sie überhaupt zu verwenden. In vielen Fällen verbrauchen sie zu viele Ressourcen, als dass sie effizient genutzt werden könnten. Aber wie jedes Tool in SQL können sie bei richtiger Verwendung wertvoll sein.
Es lohnt sich, einem der Beispielcodes zu folgen:
-- Kartesisches Produkt gibt alle Kunden für alle Monate zurück. Das kartesische Produkt multipliziert grundsätzlich die erste Tabelle mit der zweiten Tabelle und erzeugt so eine Reihe von Zeilen, die die Anzahl der Zeilen in der ersten Tabelle multipliziert mit der Anzahl der Zeilen in der zweiten Tabelle enthält. Daher gibt das kartesische Produkt 12 (alle Monate) * 81 (alle Kunden) = 972 Zeilen an die Tabelle @tblFinal zurück. Die letzten Schritte bestehen darin, die Tabelle @tblFinal mit den monatlichen Verkaufssummen für jeden Kunden für diesen Datumsbereich zu aktualisieren und den endgültigen Zeilensatz auszuwählen.
DECLARE @tblMonths TABLE (sMonth VARCHAR(7))
DECLARE @tblCustomers TABLE (CustomerID CHAR(10),
Firmenname VARCHAR(50),
Kontaktname VARCHAR(50))
DECLARE @tblFinal TABLE (sMonth VARCHAR(7),
KundenID CHAR(10),
Firmenname VARCHAR(50),
Kontaktname VARCHAR(50),
mSalesMONEY)
DECLARE @dtStartDate DATETIME,
@dtEndDate DATETIME,
@dtDate DATETIME,
@i INTEGER
SET @dtEndDate = '5/5/1997'
SET @dtEndDate = DATEADD(DD, -1, CAST(CAST((MONTH(@dtEndDate) + 1) AS
VARCHAR(2)) + '/01/' + CAST(YEAR(@dtEndDate) AS VARCHAR(4)) + ' 23:59:59' AS DATETIME))
SET @dtStartDate = DATEADD(MM, -1 * 12, @dtEndDate)
-- Alle Monate in die erste Tabelle eintragen
SETZE @i = 0
WÄHREND (@i < 12)
BEGINNEN
SET @dtDate = DATEADD(mm, -1 * @i, @dtEndDate)
INSERT INTO @tblMonths SELECT CAST(YEAR(@dtDate) AS VARCHAR(4)) + '-' +
FALL
WANN MONTH(@dtDate) < 10
THEN '0' + CAST(MONTH(@dtDate) AS VARCHAR(2))
ELSE CAST(MONTH(@dtDate) AS VARCHAR(2))
ENDE ALS sMonat
SETze @i = @i + 1
ENDE
– Tragen Sie alle Kunden, die in diesem Zeitraum Verkäufe getätigt haben, in die „y“-Tabelle ein
IN @tblCustomers EINFÜGEN
WÄHLEN SIE UNTERSCHIEDLICH
c.Kunden-ID,
c.Firmenname,
c.Kontaktname
VON Kunden c
INNER JOIN Bestellungen o ON c.CustomerID = o.CustomerID
WHERE o.OrderDate BETWEEN @dtStartDate AND @dtEndDate
INSERT INTO @tblFinal
SELECT m.sMonat,
c.CustomerID,
c.Firmenname,
c.Kontaktname,
0
FROM @tblMonths m CROSS JOIN @tblCustomers c
UPDATE @tblFinal SET
mSales = mydata.mSales
VON @tblFinal f INNER JOIN
(
SELECT c.CustomerID,
CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
FALL WENN MONTH(o.OrderDate) < 10
THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
ENDE ALS sMonat,
SUM(od.Quantity * od.UnitPrice) AS mSales
VON Kunden c
INNER JOIN-Bestellungen o ON c.CustomerID = o.CustomerID
INNER JOIN [Bestelldetails] od ON o.OrderID = od.OrderID
WO o.OrderDate ZWISCHEN @dtStartDate UND @dtEndDate
GRUPPE NACH
c.CustomerID,
CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
FALL WENN MONTH(o.OrderDate) < 10
THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
ENDE
) mydata auf f.CustomerID = mydata.CustomerID AND f.sMonth =
mydata.sMonth
SELECT f.sMonth,
f.Kunden-ID,
f.Firmenname,
f.Kontaktname,
f.mSales
VON @tblFinal f
BESTELLEN NACH
f.Firmenname,
f.sMonat
5. Nehmen Sie die fehlenden Teile auf und ergänzen Sie die fehlenden Teile.
Hier sind einige weitere gängige Techniken, die dazu beitragen können, die Effizienz von SQL-Abfragen zu verbessern. Angenommen, Sie möchten alle Verkäufer nach Region gruppieren und ihre Umsätze zusammenfassen, möchten aber nur die Verkäufer in der Datenbank als aktiv markieren. Sie können Vertriebsmitarbeiter nach Regionen gruppieren und diejenigen ausschließen, die nicht aktiv sind, indem Sie die HAVING-Klausel verwenden, oder Sie können dies in der WHERE-Klausel tun. Dies in der WHERE-Klausel zu tun, reduziert die Anzahl der Zeilen, die gruppiert werden müssen, und ist daher effizienter als dies in der HAVING-Klausel. Das Filtern basierend auf Zeilenbedingungen in der HAVING-Klausel zwingt die Abfrage dazu, Daten zu gruppieren, die in der WHERE-Klausel entfernt würden.
Ein weiterer Effizienztipp besteht darin, anstelle der GROUP BY-Klausel das Schlüsselwort DISTINCT zu verwenden, um separate Berichte für Datenzeilen zu finden. In diesem Fall ist SQL mit dem Schlüsselwort DISTINCT effizienter. Bitte verwenden Sie GROUP BY nur, wenn Sie Aggregatfunktionen (SUM, COUNT, MAX usw.) berechnen müssen. Wenn Ihre Abfrage immer eine eindeutige Zeile zurückgibt, verwenden Sie außerdem nicht das Schlüsselwort DISTINCT. In diesem Fall erhöht das Schlüsselwort DISTINCT nur den Systemaufwand.
-------------------
Chinesische URL:
http://www.microsoft.com/china/MSDN/library/data/sqlserver/FiveWaystoRevupYourSQLPerformanCE.mspx
Englische URL:
http://msdn.microsoft.com/msdnmag/issues/02/07/DataPoints/