Heim  >  Artikel  >  Datenbank  >  So verbessern Sie die Effizienz von SQL-Abfragen

So verbessern Sie die Effizienz von SQL-Abfragen

一个新手
一个新手Original
2017-10-18 10:13:211348Durchsuche

1. Um die Abfrage zu optimieren, sollten Sie zunächst erwägen, Indizes für die beteiligten Spalten zu erstellen, in denen die Reihenfolge angegeben ist.

2. Vermeiden Sie die Beurteilung des Nullwerts von Feldern in der where-Klausel, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt, z. B.:
select id from t where num ist null
Sie können den Standardwert 0 für „num“ festlegen, sicherstellen, dass in der Spalte „num“ der Tabelle kein Nullwert vorhanden ist, und dann eine Abfrage wie folgt durchführen:
Wählen Sie die ID aus t aus, wobei num=0
ist
3. Versuchen Sie, where-Klauseln zu vermeiden. Verwenden Sie den Operator != oder <>, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt.

4. Vermeiden Sie die Verwendung von oder in der where-Klausel, um Bedingungen zu verbinden, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt, z. B.:
select id from t where num= 10 oder num =20
Sie können wie folgt abfragen:
select id from t where num=10
union all
select id from t where num=20

5.in und not in sind ebenfalls erforderlich. Mit Vorsicht verwenden, sonst führt es zu einem vollständigen Tabellenscan, wie zum Beispiel:
select id from t where num in(1,2,3)
Für kontinuierliche Werte, wenn möglich Verwenden Sie zwischen, nicht verwenden in:
Wählen Sie die ID aus t aus, wobei die Zahl zwischen 1 und 3 liegt.

6. Die folgende Abfrage führt auch zu einem vollständigen Tabellenscan:
Wählen Sie die ID aus t aus, wobei der Name liegt wie „%abc%“
Zur Verbesserung der Effizienz sollten Sie die Volltextsuche in Betracht ziehen.

7. wenn in wo Die Verwendung von Parametern in der Klausel führt auch zu einem vollständigen Tabellenscan. Da SQL lokale Variablen nur zur Laufzeit auflöst, kann der Optimierer die Auswahl eines Zugriffsplans nicht bis zur Laufzeit verschieben, sondern muss die Auswahl zur Kompilierungszeit treffen. Ran Wenn der Zugriffsplan jedoch zur Kompilierungszeit erstellt wird, ist der Wert der Variablen noch unbekannt und kann nicht als Eingabe für die Indexauswahl verwendet werden. Die folgende Anweisung führt beispielsweise einen vollständigen Tabellenscan durch:
select id from t where num=@num
Sie können es ändern, um zu erzwingen, dass die Abfrage einen Index verwendet:
select id from t with( index(index name)) where num= @num

8 Vermeiden Sie die Ausführung von Ausdrucksoperationen für Felder in der where-Klausel, da dies dazu führen würde, dass die Engine die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt. Beispiel:
select id from t where num/2=100
sollte geändert werden in:
select id from t where num=100*2

9 Versuchen Sie, Where-Klauseln zu vermeiden Funktionsoperationen werden für Felder im Feld ausgeführt, was dazu führt, dass die Engine die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt. Zum Beispiel:
Wählen Sie eine ID aus t aus, wobei substring(name,1,3)='abc'--id, deren Name mit abc beginnt.
Wählen Sie eine ID aus t aus, wobei datediff(day,createdate,'2005-11- 30 ')=0--'2005-11-30' Die generierte ID
sollte geändert werden in:
Wählen Sie die ID aus t aus, wobei der Name etwa „abc%“ lautet.
Wählen Sie die ID aus t aus, wobei das Erstellungsdatum>= lautet '2005 -11-30' und createdate<'2005-12-1'

10 Führen Sie andernfalls keine Funktionen, arithmetischen Operationen oder andere Ausdrucksoperationen auf der linken Seite von „=" in der where-Klausel aus Das System ist möglicherweise nicht in der Lage, Indizes korrekt zu verwenden.

11. Wenn Sie ein Indexfeld als Bedingung verwenden und der Index ein zusammengesetzter Index ist, muss das erste Feld im Index als Bedingung verwendet werden, um sicherzustellen, dass das System den Index verwendet, andernfalls wird der Index verwendet nicht verwendet, und die Feldreihenfolge sollte so weit wie möglich mit der Indexreihenfolge übereinstimmen.

12. Wenn Sie beispielsweise eine leere Tabellenstruktur generieren müssen:
wählen Sie col1,col2 in #t aus, wobei 1=0 ist.
Dieser Typ Der Code gibt nichts zurück. Der Ergebnissatz verbraucht jedoch Systemressourcen. Er sollte wie folgt geändert werden:
create table #t(...)

13 In vielen Fällen wird „exists“ verwendet in ist eine gute Wahl:
select num from a where num in(select num from b)
Ersetzen Sie durch die folgende Anweisung:
select num from a where exist(select 1 from b where num=a. num)

14 .Nicht alle Indizes sind für Abfragen wirksam. SQL optimiert Abfragen basierend auf den Daten in der Tabelle. Wenn die Indexspalte eine große Menge doppelter Daten enthält, verwendet die SQL-Abfrage möglicherweise nicht Index, beispielsweise eine Tabelle mit den Feldern „Geschlecht“, „männlich“ und „weiblich“. Selbst wenn ein Index auf dem Geschlecht basiert, hat dies keine Auswirkung auf die Abfrageeffizienz.

15. Je mehr Indizes vorhanden sind, desto besser. Obwohl Indizes die Effizienz der entsprechenden Auswahl verbessern können, verringern sie aufgrund der Einfügung oder Aktualisierung auch die Effizienz von Einfügen und Aktualisieren aktualisieren Der Index muss möglicherweise von Zeit zu Zeit neu erstellt werden. Die Erstellung des Index muss daher sorgfältig überlegt werden und hängt von der jeweiligen Situation ab. Es ist am besten, nicht mehr als 6 Indizes für eine Tabelle zu haben. Wenn es zu viele sind, sollten Sie überlegen, ob es Indizes gibt, die auf einigen Spalten basieren, die nicht häufig verwendet werden. notwendig.

16. Vermeiden Sie die Aktualisierung von Clustered-Index-Datenspalten so weit wie möglich, da Clustered Die Reihenfolge der Indexdatenspalten ist die physische Speicherreihenfolge der Tabellendatensätze. Sobald sich der Spaltenwert ändert, wird die Reihenfolge der gesamten Tabellendatensätze angepasst, was erhebliche Ressourcen verbraucht. Wenn das Anwendungssystem häufige Updates erfordert Wenn Sie eine Clustered-Index-Datenspalte erstellen, müssen Sie überlegen, ob der Index als Clustered-Index erstellt werden soll.

17. Versuchen Sie, numerische Felder zu verwenden, versuchen Sie, sie nicht als Zeichenfelder zu gestalten. Dies verringert die Leistung von Abfragen und Verbindungen und erhöht den Speicheraufwand. Dies liegt daran, dass die Engine bei der Verarbeitung von Abfragen und Verbindungen jedes Zeichen in der Zeichenfolge einzeln vergleicht und für numerische Typen nur ein Vergleich ausreicht.

18. Verwenden Sie so oft wie möglich varchar/nvarchar anstelle von char/nchar, da Felder mit variabler Länge erstens wenig Speicherplatz haben und zweitens relativ viel Speicherplatz sparen können kleines Feld ist offensichtlich höher.

19. Verwenden Sie „select * from t“ nirgendwo, ersetzen Sie „*“ durch eine bestimmte Feldliste und geben Sie keine nicht verwendeten Felder zurück.

20. Versuchen Sie, Tabellenvariablen anstelle von temporären Tabellen zu verwenden. Wenn die Tabellenvariable eine große Datenmenge enthält, beachten Sie, dass die Indizes sehr begrenzt sind (nur Primärschlüsselindizes).

21. Vermeiden Sie das häufige Erstellen und Löschen temporärer Tabellen, um den Verbrauch von Systemtabellenressourcen zu reduzieren.

22. Temporäre Tabellen sind nicht unbrauchbar, und ihre ordnungsgemäße Verwendung kann bestimmte Routinen effizienter machen, beispielsweise wenn Sie wiederholt auf einen bestimmten Datensatz in einer großen Tabelle oder einer häufig verwendeten Tabelle verweisen müssen. Für einmalige Ereignisse ist es jedoch besser, eine Exporttabelle zu verwenden.

23. Wenn beim Erstellen einer temporären Tabelle die auf einmal eingefügte Datenmenge groß ist, können Sie „Auswählen in“ anstelle von „Tabelle erstellen“ verwenden, um zu vermeiden, dass eine große Anzahl von Protokollen die Geschwindigkeit erhöht Die Datenmenge ist nicht groß. Um das System zu entlasten, sollten Sie bei Tabellenressourcen zuerst die Tabelle erstellen und diese dann einfügen.

24. Wenn temporäre Tabellen verwendet werden, müssen alle temporären Tabellen am Ende der gespeicherten Prozedur explizit gelöscht werden. Dadurch kann eine langfristige Sperrung von Systemtabellen vermieden werden.

25. Vermeiden Sie die Verwendung von Cursorn, da Cursor weniger effizient sind. Wenn die vom Cursor verarbeiteten Daten mehr als 10.000 Zeilen umfassen, sollten Sie darüber nachdenken, sie neu zu schreiben.

26. Bevor Sie die Cursor-basierte Methode oder die temporäre Tabellenmethode verwenden, sollten Sie zunächst nach einer satzbasierten Lösung zur Lösung des Problems suchen. Die satzbasierte Methode ist normalerweise effektiver.

27. Cursor sind wie temporäre Tabellen nicht unbrauchbar. Verwenden Sie FAST_FORWARD für kleine Datensätze Cursor sind anderen zeilenweisen Verarbeitungsmethoden häufig überlegen, insbesondere wenn mehrere Tabellen referenziert werden müssen, um die erforderlichen Daten zu erhalten. Routinen, die „Summen“ in einen Ergebnissatz einbeziehen, sind normalerweise schneller als die Verwendung eines Cursors. Wenn während der Entwicklung Wenn es die Zeit erlaubt, können Sie sowohl die Cursor-basierte als auch die Satz-basierte Methode ausprobieren, um herauszufinden, welche Methode besser funktioniert.

28. Setzen Sie SET NOCOUNT ON am Anfang aller gespeicherten Prozeduren und Trigger und setzen Sie SET NOCOUNT OFF am Ende. Es ist nicht erforderlich, nach jeder Anweisung gespeicherter Prozeduren und Trigger eine DONE_IN_PROC-Nachricht an den Client zu senden.

29. Versuchen Sie, große Transaktionsvorgänge zu vermeiden und die Systemparallelität zu verbessern.

30. Vermeiden Sie die Rückgabe großer Datenmengen an den Kunden. Wenn die Datenmenge zu groß ist, sollten Sie überlegen, ob die entsprechende Nachfrage angemessen ist

Das obige ist der detaillierte Inhalt vonSo verbessern Sie die Effizienz von SQL-Abfragen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn