info@madafa.de

Tipps zur Optimierung von SQL-Abfragen

Übersicht

SQL-Anweisungen können zum Abrufen von Daten aus jeder Datenbank verwendet werden. Wenn Sie schon einmal mit Datenbanken gearbeitet haben, um Informationen abzurufen, so sind Sie höchstwahrscheinlich schon einmal auf langsam laufende Abfragen gestoßen. Ein Grund für die langsame Antwortzeit kann zum einen die Auslastung des Systems sein, zum anderen aber auch, was der häufigere Grund ist, dass die Abfragen nicht so geschrieben wurden, dass sie so effizient wie möglich arbeiten. Um eine bessere Leistung zu erreichen, müssen wir die besten, schnellsten und effizientesten Abfragen verwenden.
In diesem Beitrag zeigen wir Ihnen, wie Ihre SQL-Abfragen optimieren können, um eine bessere Leistung zu erzielen. Wir möchten die wichtigsten Punkte zum Thema Abfrageoptimierung abdecken und Ihnen einfache Tipps und Tricks an die Hand geben, die Sie zur sofortigen Leistungssteigerung einsetzen können.

I. Einführung

Abfrageoptimierung ist eine wichtiger Skill für SQL-Entwickler und Datenbankadministratoren (DBAs). Um die Leistung von SQL-Abfragen zu verbessern, müssen Entwickler und DBAs den Query Optimizer und die Techniken, die er zur Auswahl eines Zugriffspfads und um einen Abfrageausführungsplan vorzubereiten benutzt, verstehen. Der beste Weg, die Leistung zu optimieren, liegt darin, die Abfragen auf unterschiedliche Weise zu schreiben und anschließend entsprechende Lese- und Ausführungspläne zu vergleichen. Wir stellen Ihnen in diesem Beitrag verschiedene Techniken vor, mit denen Sie versuchen können, Ihre Datenbankabfragen zu optimieren.

II. Allgemeine Tipps

Tipp 1

Verwenden Sie Spaltennamen anstelle von * in einer SELECT-Anweisung

Wenn Sie nur ein paar Spalten aus einer Tabelle auswählen, ist es nicht notwendig, SELECT* zu verwenden. Dies ist zwar einfacher zu schreiben, kostet aber mehr Zeit die Abfrage abzuschließen. Wenn Sie nur die benötigten Spalten auswählen, reduzieren Sie die Größe der Ergebnistabelle, den Netzwerkverkehr und steigern somit die Gesamtleistung der Abfrage.

Beispiel:

Ursprüngliche Abfrage:

SELECT * FROM Sales.Customer;

Verbesserte Abfrage:

SELECT CustomerID FROM Sales.Customer;

Tipp 2

Vermeiden Sie die Aufnahme einer HAVING-Klausel in SELECT-Anweisungen

Die HAVING-Klausel wird wie ein Filter verwendet und ist in einer SELECT-Anweisung ziemlich nutzlos. Sie funktioniert so, dass die endgültige Ergebnistabelle der Abfrage durchlaufen wird und die Zeilen, die die HAVING-Bedingung nicht erfüllen analysiert werden.

Beispiel:

Ursprüngliche Abfrage:

SELECT CustomerID , count(CustomerID )
FROM Sales.Customer
GROUP BY CustomerID
HAVING CustomerID != 1660
AND CustomerID != 2;

Verbesserte Abfrage:

SELECT CustomerID, count(CustomerID)
FROM Sales.Customer
WHERE CustomerID != 1660
AND CustomerID !=2
GROUP BY CustomerID;

Tipp 3

Eliminieren Sie unnötige DISTINCT-Bedingungen.

Im folgenden Beispiel ist das DISTINCT-Schlüsselwort in der ursprünglichen Abfrage unnötig, weil der Tabellenname den Primärschlüssel enthält, der Teil der Ergebnismenge ist.

Beispiel:

Ursprüngliche Abfrage:

SELECT DISTINCT * FROM Person.PersonPhone
JOIN Person.Person
ON Person.PersonPhone.BusinessEntityID = Person.Person.BusinessEntityID
WHERE Title = 'Ms';

Verbesserte Abfrage:

SELECT * FROM Person.PersonPhone
JOIN Person.Person
ON Person.PersonPhone.BusinessEntityID = Person.Person.BusinessEntityID
WHERE Title = 'Ms'; 

Tipp 4

Verschachtelte Unterabfragen vermeiden

Das Umschreiben verschachtelter Abfragen als Joins führt oft zu einer effizienteren Ausführung und effektiveren Optimierung. Im Allgemeinen wird die Entschachtelung von Unterabfragen immer für korrelierte Unterabfragen mit höchstens einer Tabelle in der FROM-Klausel verwendet. Eine unkorrelierte Unterabfrage oder eine Unterabfrage mit mehr als einer Tabelle in der FROM-Klausel wird geglättet, wenn entschieden werden kann, dass die Unterabfrage höchstens eine Zeile zurückgibt.

Beispiel:

Ursprüngliche Abfrage:

SELECT * FROM Production.Product 
WHERE ProductID = 
  (Select ProductID 
	From Sales.SalesOrderDetail
	Where SalesOrderDetailID = 2379
	And OrderQty = 1 );

Verbesserte Abfrage:

SELECT * FROM Production.Product p, Sales.SalesOrderDetail s
WHERE p.ProductID = s.ProductID
AND s.SalesOrderDetailID = 2379
AND OrderQty = 1;

Tipp 5

Erwägen Sie die Verwendung eines IN-Operators bei der Abfrage einer indizierten Spalte.

Der IN-Operator kann für indizierte Abfragen genutzt werden. Die Möglichkeit die IN-Liste zu sortieren führt dazu, dass eine effizientere Abfrage ausgeführt werden kann. Beachten Sie, dass die IN-Liste nur Konstanten bzw. Werte enthalten darf, die während einer Ausführung des Abfrageblocks konstant sind.

Beispiel:

Ursprüngliche Abfrage:

SELECT *
FROM Sales.SalesOrderDetail s
WHERE s.ProductID = 760
  OR s.ProductID = 782;

Verbesserte Abfrage:

SELECT *
FROM Sales.SalesOrderDetail s
WHERE s.ProductID IN (760, 782);

Tipp 6

Verwenden Sie EXISTS anstelle von DISTINCT, wenn Sie Joins benutzen, die Tabellen mit zu vielen Beziehungen beinhalten.

Mit dem Schlüsselwort DISTINCT werden alle Spalten in der Tabelle ausgewählt und anschließend alle Duplikate entfernt. Wenn Sie stattdessen eine Unterabfrage mit dem Schlüsselwort EXISTS verwenden, können Sie vermeiden, eine ganze Tabelle zurückgeben zu müssen.

Beispiel:

Ursprüngliche Abfrage:

SELECT DISTINCT c.CountryRegionCode, c.Name 
FROM Person.CountryRegion c, Person.StateProvince s 
WHERE s.CountryRegionCode = c.CountryRegionCode;

Verbesserte Abfrage:

SELECT c.CountryRegionCode, c.Name 
FROM Person.CountryRegion c
WHERE EXISTS (SELECT 'X' FROM Person.StateProvince s  
WHERE s.CountryRegionCode = c.CountryRegionCode);

Tipp 7

Versuchen Sie, UNION ALL anstelle von UNION zu verwenden.

Die Anweisung UNION ALL ist schneller als UNION, weil die UNION ALL-Anweisung keine Duplikate berücksichtigt. Die UNION-Anweisung sucht nach Duplikaten in einer Tabelle, während Zeilen ausgewählt werden – unabhängig davon, ob sie existieren oder nicht.

Beispiel:

Ursprüngliche Abfrage:

SELECT BusinessEntityID FROM Person.PersonPhone
UNION
SELECT BusinessEntityID
FROM Person.Person

Verbesserte Abfrage:

SELECT BusinessEntityID 
FROM Person.PersonPhone
UNION ALL 
SELECT BusinessEntityID
FROM Person.Person;

Tipp 8

Vermeiden Sie die Verwendung von OR in Verknüpfungsbedingungen.

Jedes Mal, wenn Sie ein OR in der Verknüpfungsbedingung verwenden, wird die Abfrage
mindestens um den Faktor zwei verlangsamt.

Beispiel:

Ursprüngliche Abfrage:

SELECT *
FROM Sales.SalesOrderDetail s
 INNER JOIN Production.Product p ON s.UnitPrice = 
p.StandardCost OR s.UnitPrice = p.ListPrice;

Verbesserte Abfrage:

SELECT *
FROM Sales.SalesOrderDetail s
 INNER JOIN Production.Product p ON s.UnitPrice = 
p.StandardCost
UNION ALL
SELECT *
FROM Sales.SalesOrderDetail s
 INNER JOIN Production.Product p ON s.UnitPrice = 
p.ListPrice;

Tipp 9

Entfernen Sie alle überflüssige Mathematik.

Es wird immer wieder vorkommen, dass Sie innerhalb einer SQL-Abfrage mathematische Berechnungen durchführen. Sie können die Leistung beeinträchtigen, wenn sie unsachgemäß geschrieben sind. Jedes Mal, wenn die Abfrage einen entsprechende Zeile findet, wird die mathematische Berechnung erneut durchgeführt. Wenn also unnötige Berechnungen eliminiert werden können, wird die Leistung der Anweisung schneller.

Beispiel:

Ursprüngliche Abfrage:

SELECT *
FROM Sales.SalesOrderDetail s
WHERE s.ProductID + 10000 < 35000;

Verbesserte Abfrage:

SELECT *
FROM Sales.SalesOrderDetail s
WHERE s.ProductID < 25000;

II. Fazit

Die Optimierung von Abfragen ist eine häufige Aufgabe, die von Datenbankadministratoren und Anwendungsentwicklern durchgeführt wird, um die Gesamtleistung des Datenbanksystems zu optimieren. Selbst wenn Sie über eine leistungsfähige Infrastruktur verfügen, kann die Leistung durch ineffiziente Abfragen erheblich verschlechtert werden. Die Abfrageoptimierung hat einen sehr großen Einfluss auf die Leistung eines DBMS und sie entwickelt sich ständig weiter mit neuen, ausgefeilteren Optimierungsstrategien. Sie sollten versuchen, die beschriebenen Tipps zu befolgen, um eine bessere Leistung Ihrer Abfrage zu erhalten.

Als zertifizierter SQL Server Support, wissen wir bestens über Abfrageoptimierungen Bescheid. Wir helfen Ihnen, Ihre Performance signifikant zu steigern, indem wir ein Assessment Ihrer Umgebung durchführen und Ihnen wichtige Lösungsansätze präsentieren. Kontaktieren Sie uns gerne für ein unverbindliches Beratungsgespräch – ganz einfach über unser Kontaktformular.