2008-09-02 7 views

Antwort

18
  • Verwenden Primärschlüssel
  • Vermeiden Sie select *
  • Seien Sie so genau wie möglich, wenn den Aufbau Ihrer bedingten Anweisungen
  • vergleichen De-Normalisierung kann oft effizienter sein
  • Tabellenvariablen und temporäre Tabellen (wo verfügbar) sind oft besser als die Verwendung einer großen Quellentabelle
  • partitionierten Ansichten
  • Beschäftigen Indizes und Einschränkungen
0

Ich denke, mit SQL-Abfrage-Analysator wäre ein guter Anfang.

0

Stellen Sie sicher, dass Sie die richtigen Indizes für die Tabelle haben. Wenn Sie häufig eine Spalte verwenden, um ein Dataset zu ordnen oder einzuschränken, kann ein Index einen großen Unterschied machen. Ich habe in einem kürzlich erschienenen Artikel gesehen, dass Select Select wirklich eine Abfrage verlangsamen kann, besonders wenn Sie keinen Index haben.

0

Die offensichtliche Optimierung für SELECT-Abfragen stellt sicher, dass Sie Indizes für Spalten haben, die für Joins oder WHERE-Klauseln verwendet werden.

Da das Hinzufügen von Indizes die Datenschreibvorgänge verlangsamen kann, müssen Sie die Leistung überwachen, um sicherzustellen, dass die Schreibleistung der Datenbank nicht beeinträchtigt wird. Mit einem guten Abfrageanalyse-Tool können Sie die Dinge jedoch entsprechend balancieren.

3

Die größte Sache, die Sie tun können, ist nach Tabellen-Scans in SQL Server Query Analyzer zu suchen (stellen Sie sicher, dass Sie "Show Execution Plan" aktivieren). Ansonsten gibt es eine Vielzahl von Artikeln bei MSDN und anderswo, die einen guten Rat geben.

Nebenbei, als ich begann zu lernen, Abfragen optimieren, lief ich SQL Server Abfrage Profiler gegen eine Ablaufverfolgung, schaute auf die generierte SQL, und versuchte herauszufinden, warum das eine Verbesserung war. Query Profiler ist alles andere als optimal, aber es ist ein guter Start.

0
  • Indizes
  • Statistiken
  • auf Microsoft-Stack, Database Engine Tuning Advisor
7

Erfahren Sie, was wirklich unter der Haube vor sich geht - sollten Sie die folgenden Konzepte im Detail verstehen können:

  • Indizes (nicht nur was sie sind, sondern tatsächlich, wie sie funktionieren).
  • Clustered Indizes vs Heap zugeordneten Tabellen.
  • Text- und Binär-Lookups und wann sie eingefügt werden können.
  • Fill factor.
  • Wie Datensätze zum Aktualisieren/Löschen ghosted werden.
  • Wenn Seitenaufteilungen passieren und warum.
  • Statistiken, und wie sie verschiedene Abfragegeschwindigkeiten bewirken.
  • Der Abfrageplaner, und wie es für Ihre spezifische Datenbank funktioniert (zum Beispiel auf einigen Systemen "Select *" ist langsam, auf modernen MS-Sql DBs kann der Planer damit umgehen).
+2

+1, @dies ist besser als die angenommene Antwort – iruvar

2

Es gibt ein paar Dinge, die Sie betrachten können, um die Abfrageleistung zu optimieren.

  1. Stellen Sie sicher, dass Sie nur das Minimum an Daten. Stellen Sie sicher, dass Sie nur die Spalten auswählen, die Sie benötigen. Reduzieren Sie die Feldgröße auf ein Minimum.

  2. De-Normalisierung Erwägen Ihrer Datenbank verbindet zu reduzieren

  3. Schleifen vermeiden (das heißt Cursor holen), halten Operationen einzustellen.

  4. Implementieren Sie die Abfrage als gespeicherte Prozedur, da diese vorkompiliert ist und schneller ausgeführt wird.

  5. Stellen Sie sicher, dass Sie die richtigen Indizes eingerichtet haben. Wenn Ihre Datenbank hauptsächlich für die Suche verwendet wird, berücksichtigen Sie mehr Indizes.

  6. Verwenden Sie den Ausführungsplan, um zu sehen, wie die Verarbeitung erfolgt. Was Sie vermeiden möchten, ist ein Tabellenscan, da dies kostspielig ist.

  7. Stellen Sie sicher, dass die automatische Statistik aktiviert ist. SQL benötigt dies, um die optimale Ausführung zu bestimmen. Sehen Sie Mike Gunderloys großartigen Beitrag für weitere Informationen. Basics of Statistics in SQL Server 2005

  8. Stellen Sie sicher, dass Ihre Indizes nicht fragmentiert sind. Reducing SQL Server Index Fragmentation

  9. Stellen Sie sicher, dass Ihre Tabellen nicht fragmentiert sind. How to Detect Table Fragmentation in SQL Server 2000 and 2005
1

Verwenden eines mit statment query Filterung zu handhaben. Begrenzen Sie jede Unterabfrage auf die minimale Anzahl der möglichen Zeilen. dann die Unterabfragen verbinden.

WITH 
master AS 
(
    SELECT SSN, FIRST_NAME, LAST_NAME 
    FROM MASTER_SSN 
    WHERE STATE = 'PA' AND 
      GENDER = 'M' 
), 
taxReturns AS 
(
    SELECT SSN, RETURN_ID, GROSS_PAY 
    FROM MASTER_RETURNS 
    WHERE YEAR < 2003 AND 
      YEAR > 2000 
) 
SELECT * 
FROM master, 
    taxReturns 
WHERE master.ssn = taxReturns.ssn 

A Unterabfragen innerhalb eines mit Anweisung kann am Ende die gleiche wie Inline-Ansichten als, oder automatisch generierte temporäre Tabellen. Ich finde in der Arbeit, die ich mache, Einzelhandelsdaten, dass in 70-80% der Fälle ein Leistungsvorteil besteht.

100% der Zeit gibt es einen Wartungsvorteil.

0

Einige andere Punkte (-Mine sind auf SQL Server basiert, da jedes db Backend seine eigene Implementierungen hat, kann sie oder nicht für alle Datenbanken zutreffen können):

Vermeiden Sie korrelierten Unterabfragen in der Auswahl Teil einer Anweisung, Sie sind im Wesentlichen Cursor.

Entwerfen Sie Ihre Tabellen so, dass sie die richtigen Datentypen verwenden, um zu vermeiden, dass Funktionen angewendet werden müssen, um die Daten zu entfernen. Es ist viel schwieriger, Datums-Mathe zu machen, wenn Sie Ihre Daten zum Beispiel als varchar speichern.

Wenn Sie feststellen, dass Sie häufig Joins ausführen, die Funktionen in ihnen enthalten, müssen Sie über das Redesign Ihrer Tabellen nachdenken.

Wenn Ihre WHERE- oder JOIN-Bedingungen OR-Anweisungen enthalten (die langsamer sind), können Sie mit einer UNION-Anweisung eine höhere Geschwindigkeit erzielen.

UNION ALL ist schneller als UNION wenn (und nur wenn) die beiden Statements sich gegenseitig ausschließen und die gleichen Ergebnisse in beide Richtungen zurückgeben.

NICHT VORHANDEN ist in der Regel schneller als NOT IN oder mit einem links mit einem Join WHERE-Klausel von ID = null

In einer UPDATE-Abfrage ein hinzufügen WHERE-Bedingung sicherzustellen, dass Sie nicht Werte aktualisieren, die bereits gleich sind. Der Unterschied zwischen der Aktualisierung von 10.000.000 Datensätzen und 4 kann erheblich sein!

Erwägen Sie, einige Werte vorzuberechnen, wenn Sie sie häufig oder für große Berichte abfragen. Eine Summe der Werte in einem Auftrag muss nur dann ausgeführt werden, wenn der Auftrag ausgeführt oder angepasst wird, anstatt, wenn Sie die Ergebnisse von 10.000.000 Millionen Bestellungen in einem Bericht zusammenfassen. Vorberechnungen sollten in Triggern durchgeführt werden, so dass sie immer aktuell sind, wenn die zugrunde liegenden Daten geändert werden. Und es müssen auch nicht nur Zahlen sein, wir haben ein berechnetes Feld, das Namen verkettet, die wir in Berichten verwenden.

Seien Sie vorsichtig bei Skalar-UDFs, sie können langsamer sein, als den Code in eine Reihe zu bringen.

Die Temp-Tabelle ist bei großen Datensätzen schneller und bei kleinen Tabellen schneller. Zusätzlich können Sie temporäre Tabellen indizieren.

Die Formatierung ist in der Benutzeroberfläche normalerweise schneller als in SQL.

Geben Sie nicht mehr Daten zurück, als Sie tatsächlich benötigen.

Dieser scheint offensichtlich, aber Sie würden nicht glauben, wie oft ich am Ende dies beheben. Fügen Sie keine Tabellen hinzu, die nicht zum Filtern der Datensätze oder zum tatsächlichen Aufrufen eines der Felder im ausgewählten Teil der Anweisung verwendet werden. Unnötige Joins können sehr teuer sein.

Es ist eine sehr schlechte Idee, Ansichten zu erstellen, die andere Ansichten aufrufen, die andere Ansichten aufrufen. Sie können feststellen, dass Sie sich sechs Mal der gleichen Tabelle anschliessen, wenn Sie nur einmal und 100.000.000 Datensätze in einer zugrunde liegenden Ansicht erstellen müssen, um die 6 zu erhalten, die in Ihrem Endergebnis enthalten sind.

Denken Sie beim Entwerfen einer Datenbank nicht nur an die Benutzeroberfläche, um Daten einzugeben. Daten sind nutzlos, wenn sie nicht verwendet werden, also überlegen Sie, wie sie verwendet werden, nachdem sie sich in der Datenbank befinden und wie diese Daten verwaltet oder geprüft werden. Das wird oft das Design verändern. (Dies ist ein Grund, warum es eine schlechte Idee ist, ein ORM Ihre Tabellen zu entwerfen, es denkt nur über einen Anwendungsfall für die Daten nach.) Die komplexesten Abfragen, die die meisten Daten betreffen, sind Berichte kann Abfragen erheblich beschleunigen (und vereinfachen).

Datenbankspezifische Implementierungen von Features können schneller sein als die Verwendung von Standard-SQL (das ist eine der Arten, wie sie ihr Produkt verkaufen), also lernen Sie Ihre Datenbankfunktionen kennen und finden Sie heraus, welche schneller sind.

Und weil es nicht zu oft gesagt werden kann, verwenden Sie Indizes richtig, nicht zu viele oder zu wenige. Und machen Sie Ihre WHERE-Klauseln sargable (Kann Indizes verwenden).