Heim Betrieb und Instandhaltung Sicherheit So schreiben Sie hochwertige und leistungsstarke SQL-Abfrageanweisungen

So schreiben Sie hochwertige und leistungsstarke SQL-Abfrageanweisungen

May 12, 2023 pm 09:04 PM
sql

1. Zunächst müssen wir verstehen, was ein Ausführungsplan ist.

Der Ausführungsplan ist ein von der Datenbank erstellter Abfrageplan, der auf den statistischen Informationen der SQL-Anweisung und zugehörigen Tabellen basiert. Dieser Plan wird automatisch vom Abfrageoptimierer analysiert, wenn beispielsweise eine SQL-Anweisung zum Abfragen einer Tabelle verwendet wird 100.000 Datensätze, 1 Datensatz, der Abfrageoptimierer wählt die Methode „Indexsuche“. Wenn die Tabelle archiviert ist und nur noch 5.000 Datensätze vorhanden sind, ändert der Abfrageoptimierer den Plan und verwendet die Methode „Vollständiger Tabellenscan“.

Man erkennt, dass der Ausführungsplan nicht festgelegt, sondern „personalisiert“ ist. Bei der Erstellung eines korrekten „Ausführungsplans“ gibt es zwei wichtige Punkte:

(1) Sagt die SQL-Anweisung dem Abfrageoptimierer klar, was er tun möchte?

(2) Sind die vom Abfrageoptimierer ermittelten Datenbankstatistiken aktuell und korrekt?

2. Vereinheitlichen Sie die Art und Weise, SQL-Anweisungen zu schreiben.

Bei den folgenden beiden SQL-Anweisungen denken Programmierer, dass sie gleich sind, der Datenbankabfrageoptimierer geht jedoch davon aus, dass sie unterschiedlich sind.

select*from dual

select*From dual

Tatsächlich ist der Fall anders. Der Abfrageanalysator betrachtet es als zwei verschiedene SQL-Anweisungen und muss zweimal analysiert werden. Generieren Sie 2 Ausführungspläne. Daher sollten Sie als Programmierer sicherstellen, dass überall dieselbe Abfrageanweisung konsistent ist. Selbst ein Leerzeichen mehr funktioniert nicht!

3. Beim Schreiben von SQL-Anweisungen zu beachtende Punkte

Im Folgenden finden Sie eine detaillierte Einführung in einige beim Schreiben von SQL-Anweisungen zu beachtende Punkte. In diesen where-Klauseln kann das System den Index beim Ausführen der SQL-Anweisung nicht verwenden, selbst wenn für einige Spalten Indizes vorhanden sind, da SQL von schlechter Qualität ist, und verwendet außerdem einen vollständigen Tabellenscan, was zu einer extrem langsamen Antwortgeschwindigkeit führt Reduktion.

1.IST NULL und IST NICHT NULL

Sie können Null nicht als Index verwenden und jede Spalte, die einen Nullwert enthält, wird nicht in den Index aufgenommen. Selbst wenn der Index mehrere Spalten enthält, wird die Spalte aus dem Index ausgeschlossen, solange eine dieser Spalten Null enthält. Das heißt, wenn eine Spalte einen Nullwert enthält, verbessert selbst die Erstellung eines Indexes für die Spalte die Leistung nicht.

Jeder Anweisungsoptimierer, der in einer where-Klausel null oder nicht null verwendet, darf keine Indizes verwenden.

2. Vermeiden Sie die Verwendung inkompatibler Datentypen.

Der inkompatible Datentyp stellt die Typkonvertierung der vollständigen Tabellenabrufdaten dar, und der Zugriff wird zu einem vollständigen Tabellenscan

Bei denjenigen mit Join-Spalten gilt: Selbst wenn der endgültige Join-Wert ein statischer Wert ist, verwendet der Optimierer den Index nicht. Schauen wir uns ein Beispiel an. Angenommen, es gibt eine Mitarbeitertabelle (Mitarbeiter). Der Vor- und Nachname eines Mitarbeiters wird in zwei Spalten gespeichert (FIRST_NAME und NACHNAME).

Das Folgende ist eine SQL-Anweisung, die eine Join-Abfrage verwendet:

select * from equipess where first_name||''||last_name ='Beill Cliton';

Die obige Anweisung kann vollständig abfragen, ob es einen Mitarbeiter Bill Cliton gibt. Hierbei ist jedoch zu beachten, dass der Systemoptimierer nicht den auf Basis des Nachnamens erstellten Index verwendet.

Wenn die folgende SQL-Anweisung geschrieben wird, kann das Oracle-System den basierend auf Nachname erstellten Index verwenden.

*** wobei Vorname ='Beill' und Nachname ='Cliton';

4. Wie eine Anweisung, die mit einem Platzhalterzeichen beginnt (%)

Die aktuelle Anforderung lautet: Es ist erforderlich, die Mitarbeitertabelle nach Namen abzufragen, die enthalten Kliton-Leute. Sie können die folgende Abfrage-SQL-Anweisung verwenden:

Wählen Sie * von Mitarbeiter aus, wobei Nachname wie „%cliton%“ lautet. Da das Platzhalterzeichen (%) am Anfang des Suchworts erscheint, verwendet das Oracle-System hier nicht den Index von Nachname. Wenn jedoch Platzhalter an anderer Stelle in der Zeichenfolge erscheinen, kann der Optimierer den Index nutzen. Der Index wird in der folgenden Abfrage verwendet:

Wählen Sie * vom Mitarbeiter aus, wobei Nachname wie „c%“ lautet.

5 Durch das Ausführen von Vorgängen am Indexfeld wird der Index ungültig.

Vermeiden Sie die Ausführung von Funktions- oder 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 * FROM T1 WHERE F1/2=100 sollte geändert werden in: SELECT * FROM T1 WHERE F1=100*2

6. Die Anweisung „Order by“ bestimmt, wie Oracle die zurückgegebenen Abfrageergebnisse sortiert. Die Order by-Anweisung unterliegt keinen besonderen Einschränkungen hinsichtlich der zu sortierenden Spalten, und den Spalten können auch Funktionen hinzugefügt werden (z. B. Verknüpfungen oder Anhänge usw.). Alle Nicht-Indexelemente oder berechneten Ausdrücke in der Order by-Anweisung verlangsamen die Abfrage.

Überprüfen Sie die Order by-Anweisungen sorgfältig auf nicht indizierte Elemente oder Ausdrücke, die die Leistung beeinträchtigen können. Die Lösung für dieses Problem besteht darin, die order by-Anweisung so umzuschreiben, dass ein Index verwendet wird. Sie können auch einen anderen Index für die verwendete Spalte erstellen. Gleichzeitig sollten Sie die Verwendung von Ausdrücken in der order by-Klausel unbedingt vermeiden.

7. NICHT

Bei Abfragen verwenden wir häufig einige logische Ausdrücke in der Where-Klausel, z. B. größer als, kleiner als, gleich, ungleich usw. Wir können auch und (und) oder (oder) verwenden und nicht (nicht ). NOT kann verwendet werden, um jedes Vorzeichen einer logischen Operation zu negieren. Hier ist ein Beispiel für eine NOT-Klausel:

... where not (status ='VALID')

Wenn Sie NOT verwenden möchten, sollten Sie vor der negierten Phrase Klammern und vor der Phrase den NOT-Operator setzen. Der NOT-Operator ist in einem anderen logischen Operator enthalten, dem Ungleich-Operator (<>). Mit anderen Worten: Auch wenn das NOT-Wort nicht explizit zur where-Klausel der Abfrage hinzugefügt wird, befindet sich NOT immer noch im Operator, siehe folgendes Beispiel:

... where status <>'INVALID'

Für diese Abfrage kann sie so umgeschrieben werden, dass NOT nicht verwendet wird:

Wählen Sie * vom Mitarbeiter mit Gehalt<3000 oder Gehalt>3000; aus.

Obwohl die Ergebnisse dieser beiden Abfragen gleich sind, ist der zweite Abfrageplan schneller als der erster Abfrageplan. Die zweite Abfrage ermöglicht Oracle die Verwendung von Indizes für die Gehaltsspalte, während die erste Abfrage keine Indizes verwenden kann.

8. IN und EXISTS

Manchmal wird eine Spalte mit einer Reihe von Werten verglichen. Der einfachste Weg besteht darin, eine Unterabfrage in der where-Klausel zu verwenden. In der where-Klausel können zwei Formate von Unterabfragen verwendet werden.

Das erste Format ist die Verwendung des IN-Operators:

... where Column in (select * from ... where ...);

Das zweite Format ist die Verwendung des EXIST-Operators:

... where is (select 'X' from ...where ...);

Ich glaube, die meisten Leute werden das erste Format verwenden, weil es einfacher zu schreiben ist, aber tatsächlich ist das zweite Format weitaus besser als das erste. Dieses Format ist hocheffizient. In Oracle können fast alle IN-Operator-Unterabfragen mithilfe von EXISTS in Unterabfragen umgeschrieben werden.

Im zweiten Format beginnt die Unterabfrage mit „select ‚X‘“. Bei Verwendung der EXISTS-Klausel wird unabhängig davon, welche Daten die Unterabfrage aus der Tabelle extrahiert, nur die Where-Klausel berücksichtigt. Auf diese Weise muss der Optimierer nicht die gesamte Tabelle durchlaufen und kann die Arbeit nur auf der Grundlage des Index abschließen (dies setzt voraus, dass die in der where-Anweisung verwendete Spalte über einen Index verfügt). Im Vergleich zur IN-Klausel verwendet EXISTS verbundene Unterabfragen, die schwieriger zu erstellen sind als IN-Unterabfragen.

Durch die Verwendung von EXIST prüft das Oracle-System zuerst die Hauptabfrage und führt dann die Unterabfrage aus, bis es die erste Übereinstimmung findet, was Zeit spart. Wenn das Oracle-System die IN-Unterabfrage ausführt, führt es zunächst die Unterabfrage aus und speichert die erhaltene Ergebnisliste in einer indizierten temporären Tabelle. Bevor die Unterabfrage ausgeführt wird, unterbricht das System zunächst die Hauptabfrage. Nachdem die Unterabfrage abgeschlossen ist, wird sie in der temporären Tabelle gespeichert und dann wird die Hauptabfrage ausgeführt. Aus diesem Grund ist die Verwendung von EXISTS für allgemeine Abfragen schneller als die Verwendung von IN.

Gleichzeitig sollte so oft wie möglich NOT EXISTS anstelle von NOT IN verwendet werden. Obwohl beide NOT verwenden (der Index kann nicht zur Geschwindigkeitsreduzierung verwendet werden), ist NOT EXISTS effizienter als NOT IN-Abfragen.

9. 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.

Zum Beispiel: Wählen Sie die ID des Mitarbeiters aus, wobei Nummer = 10 oder Nummer = 20 ist

Okay. Abfrage wie folgt: Wählen Sie die ID des Mitarbeiters aus, wobei Anzahl = 10. Alle IDs des Mitarbeiters auswählen, wobei Anzahl = 20. Sie sollten versuchen, Ausdrucksoperationen für Felder in der Where-Klausel zu vermeiden. Dies führt dazu, dass die Engine nicht funktioniert Geben Sie die Verwendung des Index auf und führen Sie den vollständigen Tabellenscan durch. Beispiel: select id from t where num/2=100 sollte geändert werden in: select id from t where num=100*2

11 Versuchen Sie, funktionale Operationen an Feldern in der where-Klausel zu vermeiden

Dies wird dazu führen Engine gibt auf. Führen Sie einen vollständigen Tabellenscan mit einem Index durch. Beispiel: Wählen Sie eine ID aus t aus, wobei Teilzeichenfolge (Name, 1,3) = „abc“ ist. Die ID, deren Name mit abc beginnt, sollte geändert werden in:

Wählen Sie eine ID aus t aus, wobei der Name „abc%“ lautet

12. Nicht verwenden where Die linke Seite von „=“ in der Klausel muss Funktionen, arithmetische Operationen oder andere Ausdrucksoperationen ausführen, da das System sonst den Index möglicherweise nicht korrekt verwenden kann.

13. 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 nicht verwendet. Und die Feldreihenfolge sollte so weit wie möglich mit der Indexreihenfolge übereinstimmen.

14. Je mehr Indizes, desto besser

Obwohl Indizes die Effizienz der entsprechenden Auswahl verbessern können, verringern sie auch die Effizienz des Einfügens und Aktualisierens, da der Index möglicherweise während des Einfügens oder Aktualisierens neu erstellt wird Index ist erforderlich. Sorgfältig und von Fall zu Fall prüfen. 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 notwendig ist, Indizes für einige Spalten zu erstellen, die nicht häufig verwendet werden.

15. 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.

16. Verwenden Sie so oft wie möglich varchar/nvarchar anstelle von char/nchar, da erstens der Speicherplatz von Feldern variabler Länge klein ist, was zweitens die Sucheffizienz in einem relativ kleinen Feld sparen kann ist offensichtlich höher.

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

Das obige ist der detaillierte Inhalt vonSo schreiben Sie hochwertige und leistungsstarke SQL-Abfrageanweisungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was ist der Unterschied zwischen HQL und SQL im Hibernate-Framework? Was ist der Unterschied zwischen HQL und SQL im Hibernate-Framework? Apr 17, 2024 pm 02:57 PM

HQL und SQL werden im Hibernate-Framework verglichen: HQL (1. Objektorientierte Syntax, 2. Datenbankunabhängige Abfragen, 3. Typsicherheit), während SQL die Datenbank direkt betreibt (1. Datenbankunabhängige Standards, 2. Komplexe ausführbare Datei). Abfragen und Datenmanipulation).

Verwendung der Divisionsoperation in Oracle SQL Verwendung der Divisionsoperation in Oracle SQL Mar 10, 2024 pm 03:06 PM

„Verwendung der Divisionsoperation in OracleSQL“ In OracleSQL ist die Divisionsoperation eine der häufigsten mathematischen Operationen. Während der Datenabfrage und -verarbeitung können uns Divisionsoperationen dabei helfen, das Verhältnis zwischen Feldern zu berechnen oder die logische Beziehung zwischen bestimmten Werten abzuleiten. In diesem Artikel wird die Verwendung der Divisionsoperation in OracleSQL vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Zwei Arten von Divisionsoperationen in OracleSQL In OracleSQL können Divisionsoperationen auf zwei verschiedene Arten durchgeführt werden.

Vergleich und Unterschiede der SQL-Syntax zwischen Oracle und DB2 Vergleich und Unterschiede der SQL-Syntax zwischen Oracle und DB2 Mar 11, 2024 pm 12:09 PM

Oracle und DB2 sind zwei häufig verwendete relationale Datenbankverwaltungssysteme, die jeweils über ihre eigene, einzigartige SQL-Syntax und -Eigenschaften verfügen. In diesem Artikel werden die SQL-Syntax von Oracle und DB2 verglichen und unterschieden und spezifische Codebeispiele bereitgestellt. Datenbankverbindung Verwenden Sie in Oracle die folgende Anweisung, um eine Verbindung zur Datenbank herzustellen: CONNECTusername/password@database. In DB2 lautet die Anweisung zum Herstellen einer Verbindung zur Datenbank wie folgt: CONNECTTOdataba

Ausführliche Erläuterung der Funktion „Tag festlegen' in den dynamischen SQL-Tags von MyBatis Ausführliche Erläuterung der Funktion „Tag festlegen' in den dynamischen SQL-Tags von MyBatis Feb 26, 2024 pm 07:48 PM

Interpretation der dynamischen SQL-Tags von MyBatis: Detaillierte Erläuterung der Verwendung von Set-Tags. MyBatis ist ein hervorragendes Persistenzschicht-Framework. Es bietet eine Fülle dynamischer SQL-Tags und kann Datenbankoperationsanweisungen flexibel erstellen. Unter anderem wird das Set-Tag zum Generieren der SET-Klausel in der UPDATE-Anweisung verwendet, die sehr häufig bei Aktualisierungsvorgängen verwendet wird. In diesem Artikel wird die Verwendung des Set-Tags in MyBatis ausführlich erläutert und seine Funktionalität anhand spezifischer Codebeispiele demonstriert. Was ist Set-Tag? Set-Tag wird in MyBati verwendet

Was bedeutet das Identitätsattribut in SQL? Was bedeutet das Identitätsattribut in SQL? Feb 19, 2024 am 11:24 AM

Was ist Identität in SQL? In SQL ist Identität ein spezieller Datentyp, der zum Generieren automatisch inkrementierender Zahlen verwendet wird. Er wird häufig verwendet, um jede Datenzeile in einer Tabelle eindeutig zu identifizieren. Die Spalte „Identität“ wird oft in Verbindung mit der Primärschlüsselspalte verwendet, um sicherzustellen, dass jeder Datensatz eine eindeutige Kennung hat. In diesem Artikel wird die Verwendung von Identity detailliert beschrieben und es werden einige praktische Codebeispiele aufgeführt. Die grundlegende Möglichkeit, Identity zu verwenden, besteht darin, Identit beim Erstellen einer Tabelle zu verwenden.

So implementieren Sie Springboot+Mybatis-plus, ohne SQL-Anweisungen zum Hinzufügen mehrerer Tabellen zu verwenden So implementieren Sie Springboot+Mybatis-plus, ohne SQL-Anweisungen zum Hinzufügen mehrerer Tabellen zu verwenden Jun 02, 2023 am 11:07 AM

Wenn Springboot + Mybatis-plus keine SQL-Anweisungen zum Hinzufügen mehrerer Tabellen verwendet, werden die Probleme, auf die ich gestoßen bin, durch die Simulation des Denkens in der Testumgebung zerlegt: Erstellen Sie ein BrandDTO-Objekt mit Parametern, um die Übergabe von Parametern an den Hintergrund zu simulieren dass es äußerst schwierig ist, Multi-Table-Operationen in Mybatis-plus durchzuführen. Wenn Sie keine Tools wie Mybatis-plus-join verwenden, können Sie nur die entsprechende Mapper.xml-Datei konfigurieren und die stinkende und lange ResultMap konfigurieren Schreiben Sie die entsprechende SQL-Anweisung. Obwohl diese Methode umständlich erscheint, ist sie äußerst flexibel und ermöglicht es uns

So beheben Sie den 5120-Fehler in SQL So beheben Sie den 5120-Fehler in SQL Mar 06, 2024 pm 04:33 PM

Lösung: 1. Überprüfen Sie, ob der angemeldete Benutzer über ausreichende Berechtigungen zum Zugriff auf oder zum Betrieb der Datenbank verfügt, und stellen Sie sicher, dass der Benutzer über die richtigen Berechtigungen verfügt. 2. Überprüfen Sie, ob das Konto des SQL Server-Dienstes über die Berechtigung zum Zugriff auf die angegebene Datei verfügt Ordner und stellen Sie sicher, dass das Konto über ausreichende Berechtigungen zum Lesen und Schreiben der Datei oder des Ordners verfügt. 3. Überprüfen Sie, ob die angegebene Datenbankdatei von anderen Prozessen geöffnet oder gesperrt wurde. Versuchen Sie, die Datei zu schließen oder freizugeben, und führen Sie die Abfrage erneut aus . Versuchen Sie es als Administrator. Führen Sie Management Studio aus als usw.

Wie verwende ich SQL-Anweisungen zur Datenaggregation und Statistik in MySQL? Wie verwende ich SQL-Anweisungen zur Datenaggregation und Statistik in MySQL? Dec 17, 2023 am 08:41 AM

Wie verwende ich SQL-Anweisungen zur Datenaggregation und Statistik in MySQL? Datenaggregation und Statistiken sind sehr wichtige Schritte bei der Durchführung von Datenanalysen und Statistiken. Als leistungsstarkes relationales Datenbankverwaltungssystem bietet MySQL eine Fülle von Aggregations- und Statistikfunktionen, mit denen Datenaggregation und statistische Operationen problemlos durchgeführt werden können. In diesem Artikel wird die Methode zur Verwendung von SQL-Anweisungen zur Durchführung von Datenaggregation und Statistiken in MySQL vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Verwenden Sie zum Zählen die COUNT-Funktion. Die COUNT-Funktion wird am häufigsten verwendet

See all articles