Heim System-Tutorial LINUX Der ultimative Leitfaden – Wie schreibe ich bessere SQL-Abfragen?

Der ultimative Leitfaden – Wie schreibe ich bessere SQL-Abfragen?

Jan 12, 2024 pm 12:15 PM
linux linux教程 红帽 linux系统 linux命令 Linux-Zertifizierung Red Hat Linux Linux-Video

Abfragen basierend auf Sammlungs- und Programmmethoden

Im umgekehrten Modell ist die Tatsache impliziert, dass es einen Unterschied zwischen sammlungsbasierten und prozeduralen Ansätzen zur Abfrageerstellung gibt.

  • Der prozedurale Ansatz beim Abfragen ist dem Programmieren sehr ähnlich: Sie teilen dem System mit, was zu tun ist und wie es zu tun ist. Fragen Sie beispielsweise wie im Beispiel im vorherigen Artikel die Datenbank ab, indem Sie eine Funktion ausführen und dann eine andere Funktion aufrufen, oder verwenden Sie einen logischen Ansatz mit Schleifen, Bedingungen und benutzerdefinierten Funktionen (UDF), um das endgültige Abfrageergebnis zu erhalten. Sie werden feststellen, dass Sie auf diese Weise immer eine Teilmenge der Daten in jeder Ebene anfordern. Dieser Ansatz wird oft auch als schrittweise oder zeilenweise Abfrage bezeichnet.
  • Der andere ist ein sammlungsbasierter Ansatz, bei dem Sie nur die Vorgänge angeben müssen, die ausgeführt werden müssen. Bei dieser Methode müssen Sie lediglich die Bedingungen und Anforderungen für die Ergebnisse angeben, die Sie durch die Abfrage erhalten möchten. Beim Abrufen von Daten müssen Sie nicht auf die internen Mechanismen achten, die die Abfrage implementieren: Die Datenbank-Engine ermittelt den besten Algorithmus und die beste Logik zum Ausführen der Abfrage.

Da SQL satzbasiert ist, ist dieser Ansatz effizienter als der prozedurale Ansatz, was erklärt, warum SQL in manchen Fällen schneller arbeiten kann als Code.

Die satzbasierte Abfragemethode ist ebenfalls eine Fähigkeit, die Sie in der Data-Mining-Analysebranche beherrschen müssen! Denn Sie müssen in der Lage sein, zwischen diesen beiden Methoden zu wechseln. Wenn Sie feststellen, dass Ihre Abfragen prozedurale Fragen enthalten, sollten Sie überlegen, ob dieser Teil neu geschrieben werden muss.

Der ultimative Leitfaden – Wie schreibe ich bessere SQL-Abfragen?

Von der Anfrage bis zum Ausführungsplan

Der Rückwärtsmodus ist nicht statisch. Auf dem Weg zum SQL-Entwickler kann es eine entmutigende Aufgabe sein, Abfrage-Reverse-Modelle zu vermeiden und Abfragen neu zu schreiben. Daher müssen Sie häufig Tools verwenden, um Ihre Abfragen strukturierter zu optimieren.

Das Nachdenken über Leistung erfordert nicht nur einen strukturierteren Ansatz, sondern auch einen tieferen Ansatz.

Diese strukturierte und tiefgehende Vorgehensweise basiert jedoch in erster Linie auf Abfrageplänen. Der Abfrageplan wird zunächst in einen „Analysebaum“ geparst und definiert genau, welcher Algorithmus für jede Operation verwendet wird und wie die Operationen koordiniert werden.

Abfrageoptimierung

Beim Optimieren einer Abfrage müssen Sie höchstwahrscheinlich den vom Optimierer generierten Plan manuell überprüfen. In diesem Fall müssen Sie Ihre Abfrage erneut analysieren, indem Sie sich den Abfrageplan ansehen.

Um einen solchen Abfrageplan zu beherrschen, müssen Sie einige vom Datenbankverwaltungssystem bereitgestellte Tools verwenden. Hier sind einige Tools, die Sie verwenden können:

  • Einige Softwarepakete verfügen über Tools, mit denen grafische Darstellungen von Abfrageplänen erstellt werden können.
  • Andere Tools können Ihnen Textbeschreibungen von Abfrageplänen liefern.

Beachten Sie, dass Sie bei Verwendung von PostgreSQL zwischen verschiedenen EXPLAINs unterscheiden können. Sie erhalten lediglich eine Beschreibung, wie der Planer die Abfrage ausführt, ohne den Plan auszuführen. Gleichzeitig führt EXPLAIN ANALYZE die Abfrage aus und sendet Ihnen einen Analysebericht zurück, der den Abfrageplan und den tatsächlichen Abfrageplan bewertet. Im Allgemeinen führt der tatsächliche Ausführungsplan den Plan tatsächlich aus, während der ausgewertete Ausführungsplan dieses Problem lösen kann, ohne die Abfrage auszuführen. Logischerweise ist der tatsächliche Ausführungsplan nützlicher, da er zusätzliche Details und Statistiken darüber enthält, was tatsächlich passiert ist, als die Abfrage ausgeführt wurde.

Als nächstes erfahren Sie mehr über XPLAIN und ANALYZE und wie Sie diese beiden Befehle verwenden, um Ihre Abfragepläne und die Abfrageleistung besser zu verstehen. Dazu müssen Sie zunächst einige Beispiele mit zwei Tabellen erstellen: one_million und half_million.

Sie können die aktuellen Informationen der Tabelle „one_million“ mit Hilfe von EXPLAIN abrufen: Stellen Sie sicher, dass Sie sie beim Ausführen der Abfrage an erster Stelle platzieren. Nach Abschluss der Ausführung werden sie an den Abfrageplan zurückgegeben:

EXPLAIN
SELECT *
FROM one_million;
QUERY PLAN
<span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-emphasis">___</span>_
Seq Scan on one_million
(cost=0.00..18584.82 rows=1025082 width=36)
(1 row)
Nach dem Login kopieren

Im obigen Beispiel sehen wir, dass die Kosten der Abfrage 0,00..18584,82 betragen, die Anzahl der Zeilen 1025082 beträgt und die Spaltenbreite 36 beträgt.

Gleichzeitig können Sie mit ANALYZE auch statistische Informationen aktualisieren.

ANALYZE one_million;
EXPLAIN
SELECT *
FROM one_million;
QUERY PLAN
<span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-emphasis">___</span>_
Seq Scan on one_million
(cost=0.00..18334.00 rows=1000000 width=37)
(1 row)
Nach dem Login kopieren

Zusätzlich zu EXPLAIN und ANALYZE können Sie die tatsächliche Ausführungszeit auch mit Hilfe von EXPLAIN ANALYZE abrufen:

EXPLAIN ANALYZE
SELECT *
FROM one_million;
QUERY PLAN
<span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span>_
Seq Scan on one_million
(cost=0.00..18334.00 rows=1000000 width=37)
(actual time=0.015..1207.019 rows=1000000 loops=1)
Total runtime: 2320.146 ms
(2 rows)
Nach dem Login kopieren

Der Nachteil der Verwendung von EXPLAIN ANALYZE besteht darin, dass Sie die Abfrage tatsächlich ausführen müssen, was erwähnenswert ist!

Alle Algorithmen, die wir bisher gesehen haben, sind sequentielle Scans oder vollständige Tabellenscans: Dies ist eine Methode zum Scannen einer Datenbank, bei der jede Zeile der gescannten Tabelle in sequentieller (serieller) Reihenfolge gelesen wird und jede Spalte überprüft wird Sehen Sie, ob es die Kriterien erfüllt. In Bezug auf die Leistung ist ein sequenzieller Scan nicht der beste Ausführungsplan, da die gesamte Tabelle gescannt werden muss. Wenn Sie jedoch eine langsame Festplatte verwenden, sind auch sequentielle Lesevorgänge schnell.

Es gibt einige Beispiele für andere Algorithmen:

EXPLAIN ANALYZE
SELECT *
FROM one<span class="hljs-emphasis">_million JOIN half_</span>million
ON (one<span class="hljs-emphasis">_million.counter=half_</span>million.counter);
QUERY PLAN
<span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span><span class="hljs-strong">_____</span>_
Hash Join (cost=15417.00..68831.00 rows=500000 width=42)
(actual time=1241.471..5912.553 rows=500000 loops=1)
Hash Cond: (one<span class="hljs-emphasis">_million.counter = half_</span>million.counter)
<span class="hljs-code">    -> Seq Scan on one_million</span>
<span class="hljs-code">    (cost=0.00..18334.00 rows=1000000 width=37)</span>
<span class="hljs-code">    (actual time=0.007..1254.027 rows=1000000 loops=1)</span>
<span class="hljs-code">    -> Hash (cost=7213.00..7213.00 rows=500000 width=5)</span>
<span class="hljs-code">    (actual time=1241.251..1241.251 rows=500000 loops=1)</span>
<span class="hljs-code">    Buckets: 4096 Batches: 16 Memory Usage: 770kB</span>
<span class="hljs-code">    -> Seq Scan on half_million</span>
<span class="hljs-code">    (cost=0.00..7213.00 rows=500000 width=5)</span>
(actual time=0.008..601.128 rows=500000 loops=1)
Total runtime: 6468.337 ms
Nach dem Login kopieren

Wir können sehen, dass der Abfrageoptimierer Hash Join ausgewählt hat. Denken Sie an diesen Vorgang, da wir ihn verwenden müssen, um die zeitliche Komplexität der Abfrage zu bewerten. Uns ist aufgefallen, dass es im obigen Beispiel keinen half_million.counter-Index gibt. Wir können den Index im folgenden Beispiel hinzufügen:

<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">INDEX</span> <span class="hljs-keyword">ON</span> half_million(counter);
<span class="hljs-keyword">EXPLAIN</span> <span class="hljs-keyword">ANALYZE</span>
<span class="hljs-keyword">SELECT</span> *
<span class="hljs-keyword">FROM</span> one_million <span class="hljs-keyword">JOIN</span> half_million
<span class="hljs-keyword">ON</span> (one_million.counter=half_million.counter);
QUERY PLAN
______________________________________________________________
<span class="hljs-keyword">Merge</span> <span class="hljs-keyword">Join</span> (<span class="hljs-keyword">cost</span>=<span class="hljs-number">4.12</span>.<span class="hljs-number">.37650</span><span class="hljs-number">.65</span> <span class="hljs-keyword">rows</span>=<span class="hljs-number">500000</span> width=<span class="hljs-number">42</span>)
(actual <span class="hljs-keyword">time</span>=<span class="hljs-number">0.033</span>.<span class="hljs-number">.3272</span><span class="hljs-number">.940</span> <span class="hljs-keyword">rows</span>=<span class="hljs-number">500000</span> loops=<span class="hljs-number">1</span>)
<span class="hljs-keyword">Merge</span> Cond: (one_million.counter = half_million.counter)
    -> <span class="hljs-keyword">Index</span> <span class="hljs-keyword">Scan</span> <span class="hljs-keyword">using</span> one_million_counter_idx <span class="hljs-keyword">on</span> one_million
    (<span class="hljs-keyword">cost</span>=<span class="hljs-number">0.00</span>.<span class="hljs-number">.32129</span><span class="hljs-number">.34</span> <span class="hljs-keyword">rows</span>=<span class="hljs-number">1000000</span> width=<span class="hljs-number">37</span>)
    (actual <span class="hljs-keyword">time</span>=<span class="hljs-number">0.011</span>.<span class="hljs-number">.694</span><span class="hljs-number">.466</span> <span class="hljs-keyword">rows</span>=<span class="hljs-number">500001</span> loops=<span class="hljs-number">1</span>)
    -> <span class="hljs-keyword">Index</span> <span class="hljs-keyword">Scan</span> <span class="hljs-keyword">using</span> half_million_counter_idx <span class="hljs-keyword">on</span> half_million
    (<span class="hljs-keyword">cost</span>=<span class="hljs-number">0.00</span>.<span class="hljs-number">.14120</span><span class="hljs-number">.29</span> <span class="hljs-keyword">rows</span>=<span class="hljs-number">500000</span> width=<span class="hljs-number">5</span>)
(actual <span class="hljs-keyword">time</span>=<span class="hljs-number">0.010</span>.<span class="hljs-number">.683</span><span class="hljs-number">.674</span> <span class="hljs-keyword">rows</span>=<span class="hljs-number">500000</span> loops=<span class="hljs-number">1</span>)
Total runtime: <span class="hljs-number">3833.310</span> ms
(<span class="hljs-number">5</span> <span class="hljs-keyword">rows</span>)
Nach dem Login kopieren

Durch die Erstellung des Index hat der Abfrageoptimierer entschieden, wie der Merge-Join beim Scannen des Index gefunden wird.

Bitte beachten Sie den Unterschied zwischen einem Index-Scan und einem vollständigen Tabellen-Scan (sequentieller Scan): Letzterer (auch „Tabellen-Scan“ genannt) findet geeignete Ergebnisse, indem er alle Daten scannt oder alle Seiten indiziert, während ersterer nur jede einzelne Zeile scannt Der Tisch.

Der zweite Teil des Tutorials wird hier vorgestellt. Der letzte Artikel der Reihe „So schreiben Sie bessere SQL-Abfragen“ folgt, bleiben Sie also auf dem Laufenden.

Bitte geben Sie die Quelle des Nachdrucks an: Grape City Control

Das obige ist der detaillierte Inhalt vonDer ultimative Leitfaden – Wie schreibe ich bessere SQL-Abfragen?. 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)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen 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)

Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal? Apr 01, 2025 pm 05:09 PM

Lösung für Erlaubnisprobleme beim Betrachten der Python -Version in Linux Terminal Wenn Sie versuchen, die Python -Version in Linux Terminal anzuzeigen, geben Sie Python ein ...

Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Warum tritt bei der Installation einer Erweiterung mit PECL in einer Docker -Umgebung ein Fehler auf? Wie löst ich es? Apr 01, 2025 pm 03:06 PM

Ursachen und Lösungen für Fehler Bei der Verwendung von PECL zur Installation von Erweiterungen in der Docker -Umgebung, wenn die Docker -Umgebung verwendet wird, begegnen wir häufig auf einige Kopfschmerzen ...

Wie kann man Node.js oder Python -Dienste in Lampenarchitektur effizient integrieren? Wie kann man Node.js oder Python -Dienste in Lampenarchitektur effizient integrieren? Apr 01, 2025 pm 02:48 PM

Viele Website -Entwickler stehen vor dem Problem der Integration von Node.js oder Python Services unter der Lampenarchitektur: Die vorhandene Lampe (Linux Apache MySQL PHP) Architekturwebsite benötigt ...

Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Wie löste ich Berechtigungsprobleme bei der Verwendung von Python -Verssionsbefehl im Linux Terminal? Apr 02, 2025 am 06:36 AM

Verwenden Sie Python im Linux -Terminal ...

Was sollte ich tun, wenn Beyond Compare bei der Synchronisierung von Windows- und Linux -Dateien nicht die Sensibilität des Falls nicht in die Fall ist? Was sollte ich tun, wenn Beyond Compare bei der Synchronisierung von Windows- und Linux -Dateien nicht die Sensibilität des Falls nicht in die Fall ist? Apr 01, 2025 am 08:06 AM

Das Problem des Vergleichs und Synchronisierens von Dateien überkompeten: Fallempfindlichkeitsfehler bei der Verwendung von Beyond ...

Wie konfigurieren Sie die Timing -Timing -Aufgabe von ApScheduler als Dienst auf macOS? Wie konfigurieren Sie die Timing -Timing -Aufgabe von ApScheduler als Dienst auf macOS? Apr 01, 2025 pm 06:09 PM

Konfigurieren Sie die Timing -Timing -Timing -Timing -Timing auf der MacOS -Plattform, wenn Sie die Timing -Timing -Timing -Timing von APScheduler als Service konfigurieren möchten, ähnlich wie bei NGIN ...

Kann der Python -Dolmetscher im Linux -System gelöscht werden? Kann der Python -Dolmetscher im Linux -System gelöscht werden? Apr 02, 2025 am 07:00 AM

In Bezug auf das Problem der Entfernung des Python -Dolmetschers, das mit Linux -Systemen ausgestattet ist, werden viele Linux -Verteilungen den Python -Dolmetscher bei der Installation vorinstallieren, und verwendet den Paketmanager nicht ...

Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Apr 03, 2025 pm 03:00 PM

Multithreading in der Sprache kann die Programmeffizienz erheblich verbessern. Es gibt vier Hauptmethoden, um Multithreading in C -Sprache zu implementieren: Erstellen Sie unabhängige Prozesse: Erstellen Sie mehrere unabhängig laufende Prozesse. Jeder Prozess hat seinen eigenen Speicherplatz. Pseudo-MultitHhreading: Erstellen Sie mehrere Ausführungsströme in einem Prozess, der denselben Speicherplatz freigibt und abwechselnd ausführt. Multi-Thread-Bibliothek: Verwenden Sie Multi-Thread-Bibliotheken wie PThreads, um Threads zu erstellen und zu verwalten, wodurch reichhaltige Funktionen der Thread-Betriebsfunktionen bereitgestellt werden. Coroutine: Eine leichte Multi-Thread-Implementierung, die Aufgaben in kleine Unteraufgaben unterteilt und sie wiederum ausführt.

See all articles