SQL-Abfrageoptimierung: Ausführungspläne lesen und langsame Abfragen mit Zeitvorgaben beheben

  1. Startseite
  2. Blog
  3. Datenbanken und SQL

Datenbanken und SQL

SQL-Abfrageoptimierung: Ausführungspläne lesen und langsame Abfragen mit Zeitvorgaben beheben

Hören Sie auf zu raten, warum eine Abfrage langsam ist. Lernen Sie, einen Ausführungsplan zu lesen und dann die Korrekturen anzuwenden, die am wichtigsten sind, mit Vorher-Nachher-Messungen aus einer echten Tabelle mit einer Million Zeilen.

9 Min. Lesezeit
SQL-Abfrageoptimierung: Ausführungspläne lesen und langsame Abfragen mit Zeitvorgaben beheben

Das Wichtigste

  • Beginnen Sie mit dem Ausführungsplan. Es zeigt Ihnen, was die Datenbank tatsächlich tut.
  • Suchen Sie nach vollständigen Scans für große Tabellen und fügen Sie dann Indizes hinzu, die Ihren Filtern und Verknüpfungen entsprechen.
  • Vermeiden Sie es, eine indizierte Spalte in eine Funktion einzuschließen, da dies die effiziente Indexnutzung beeinträchtigen kann.
  • Messen Sie vorher und nachher, denn jede Datenbank und jeder Datensatz verhält sich anders.

Eine Abfrage, die letztes Jahr Millisekunden gedauert hat, kann heute Minuten dauern, einfach weil die Tabelle gewachsen ist. Bei der SQL-Abfrageoptimierung geht es weniger um clevere Tricks als vielmehr um einen wiederholbaren Prozess: Finden Sie heraus, was die Datenbank tut, entfernen Sie die verschwendete Arbeit und überprüfen Sie, ob es geholfen hat.

Wir haben jede der folgenden Techniken an einer Million generierten Zeilen in SQLite 3.50 getestet. Die Timings sind die besten Ergebnisse aus mehreren Läufen auf einem Laptop unter Verwendung einer In-Memory-Datenbank. Sie passen nicht zu Ihrem System, und PostgreSQL, MySQL und SQL Server verfügen jeweils über eigene Optimierer und Planformate. Konzentrieren Sie sich auf den Umfang jeder Verbesserung und auf die dahinter stehenden Prinzipien.

Ergebnisse auf einen Blick

Technik Vorher Nachher
Index für die Filterspalte 73 ms 0,01 ms
Bereich statt einer Funktion für eine Spalte 96 ms 33 ms
Zusammengesetzter Index für zwei Filter 19 ms 2,2 ms
Keyset statt Deep OFFSET 8,1 ms 0,01 ms

Der Testaufbau

CREATE TABLE customers (
  id INTEGER PRIMARY KEY, name TEXT, city TEXT
);
CREATE TABLE orders (
  id INTEGER PRIMARY KEY, customer_id INT, status TEXT,
  created TEXT, total INT, note TEXT
);
-- 50,000 customers and 1,000,000 orders with random values

Ein einfacher Optimierungsprozess

  1. Finden Sie die Abfragen, die wichtig sind. Verwenden Sie langsame Abfrageprotokolle oder Überwachung. Eine 200-ms-Abfrage, die tausendmal pro Minute ausgeführt wird, kann wichtiger sein als ein 10-sekündiger monatlicher Bericht.
  2. Lesen Sie den Plan. Sehen Sie, was die Datenbank wirklich tut.
  3. Ändern Sie eine Sache. Fügen Sie einen Index hinzu oder schreiben Sie einen Teil der Abfrage neu.
  4. Machen Sie erneut, anhand realistischer Daten. Ein Plan mit 100 Testzeilen sagt sehr wenig über eine Million aus.
  5. Beobachten Sie es im Laufe der Zeit. Pläne können sich ändern, wenn die Daten wachsen und sich Statistiken ändern.

Lesen Sie einen Ausführungsplan

Ein Ausführungsplan ist die schrittweise Strategie der Datenbank zum Ausführen einer Abfrage, einschließlich der verwendeten Indizes und der Reihenfolge, in der Tabellen verknüpft werden. Stellen Sie eine Abfrage voran, um sie anzuzeigen:

Datenbank Befehl
SQLite ABFRAGEPLAN ERKLÄREN AUSWÄHLEN ...
PostgreSQL ERKLÄREN ANALYSE AUSWÄHLEN ...
MySQL EXPLAIN SELECT ... oder EXPLAIN ANALYZE
SQL-Server Tatsächlicher Ausführungsplan in SSMS

Beachten Sie, dass EXPLAIN ANALYZE in PostgreSQL die Abfrage tatsächlich ausführt. Seien Sie also vorsichtig, wenn Sie es mit UPDATE oder DELETE verwenden. Hier ist, worauf Sie zuerst achten sollten:

Sie sehen Bedeutung Normalerweise
Scan oder Seq Scan Liest die gesamte Tabelle Ein Problem bei großen Tischen
Suche oder Indexsuche Springt zu passenden Zeilen Gut
Abdeckindex Allein aus dem Index beantwortet Sehr gut
Temporärer B-Baum oder Sortieren Zusätzliche Sortierarbeit Eine Überprüfung lohnt sich

Ein vollständiger Scan ist nicht automatisch schlecht. Wenn eine Abfrage den größten Teil einer kleinen Tabelle benötigt, kann das Scannen die schnellste Wahl sein. Vergleichen Sie in PostgreSQLs EXPLAIN ANALYZE auch geschätzte Zeilen mit tatsächlichen Zeilen. Ein großer Unterschied bedeutet oft, dass Tabellenstatistiken veraltet sind.

Fügen Sie den richtigen Index hinzu

Diese Abfrage findet die Bestellungen eines Kunden:

SELECT id, total FROM orders WHERE customer_id = 123;

Vor dem Hinzufügen eines Index war ein vollständiger Scan geplant:

SCAN orders
-- 20 rows in 73 ms

Dann haben wir der Filterspalte einen Index hinzugefügt:

CREATE INDEX idx_orders_customer ON orders(customer_id);

SEARCH orders USING INDEX idx_orders_customer (customer_id=?)
-- 20 rows in 0.01 ms

Die gleichen 20 Zeilen kamen tausendmal schneller zurück, da die Datenbank nicht mehr eine Million Zeilen las, um sie zu finden. Keine andere Technik in diesem Artikel hat uns einen größeren Gewinn beschert. Gute erste Kandidaten sind Spalten, die in WHERE, JOIN und ORDER BY verwendet werden, insbesondere wenn sie die Ergebnisse auf wenige Zeilen eingrenzen. Unser Leitfaden zu SQL-Indizes erklärt, wie sie funktionieren.

Wickeln Sie indizierte Spalten nicht in Funktionen ein

Hier sind zwei Möglichkeiten, März-Bestellungen zu finden, mit einem Index auf created:

-- Function on the column
SELECT id FROM orders WHERE substr(created, 1, 7) = '2026-03';
-- SCAN orders USING COVERING INDEX idx_orders_created
-- 84,961 rows in 96 ms

-- Plain range
SELECT id FROM orders
WHERE created >= '2026-03-01' AND created < '2026-04-01';
-- SEARCH orders USING COVERING INDEX idx_orders_created (created>? AND created<?)
-- 84,961 rows in 33 ms

Beide geben identische Zeilen zurück, die erste dauerte jedoch etwa dreimal so lange. Der Plan zeigt, warum: Mit einer Funktion auf der Spalte kann die Datenbank nicht zu einer Position im sortierten Index springen, also muss sie jeden Eintrag mit SCAN durchlaufen. Die Range-Version kann SEARCH direkt an der richtigen Stelle sein. Eine Bedingung, die einen Index auf diese Weise verwenden kann, heißt sargable.

Das gleiche Problem tritt bei diesen häufigen Mustern auf:

Vermeiden Bevorzugen
WO JAHR (erstellt) = 2026 WO erstellt >= '2026-01-01' UND erstellt < '2027-01-01'
WO Preis * 2 > 100 WO Preis > 50
WHERE LOWER(email) = 'a@b.com' Ein funktionsbasierter Index oder eine Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung
WHERE-Name LIKE '%99' Eine Präfixsuche oder Volltextsuche

Letzteres haben wir auch überprüft. Ein führender Platzhalter erzeugte SCAN customers, da ein nach dem ersten Buchstaben sortierter Index bei einer Übereinstimmung am Ende nicht weiterhelfen kann.

Zusammengesetzte Indizes

Wenn eine Abfrage nach zwei Spalten filtert, erledigt ein einspaltiger Index nur einen Teil der Aufgabe:

SELECT id FROM orders
WHERE status = 'paid'
  AND created >= '2026-03-01' AND created < '2026-03-08';

-- Using only the created index: 6,198 rows in 19 ms

CREATE INDEX idx_status_created ON orders(status, created);

-- SEARCH orders USING COVERING INDEX idx_status_created
--   (status=? AND created>? AND created<?)
-- 6,198 rows in 2.2 ms

Die Reihenfolge der Spalten ist sehr wichtig. Ein Index zu (status, created) funktioniert wie ein Telefonbuch, sortiert nach Nachname und dann Vorname. Sie können nur einen Nachnamen nachschlagen, nicht jedoch nur einen Vornamen. Allein unsere Abfrage zu status könnte diesen Index verwenden. Das alleinige Filtern nach created konnte es im Allgemeinen nicht effizient nutzen. Als Faustregel gilt, dass die auf Gleichheit getesteten Spalten zuerst und die Bereichsspalten danach platziert werden sollen.

In diesem Plan steht auch, dass der Index den Index abdeckt, was bedeutet, dass der Index alles enthielt, was die Abfrage benötigte, sodass die Tabelle selbst nicht gelesen werden musste. Wenn Sie nur die Spalten auswählen, die Sie benötigen, ist dies wahrscheinlicher, was ein weiterer Grund ist, SELECT * zu vermeiden.

Schnellere Paginierung

Die Verwendung von OFFSET für tiefe Seiten ist mit versteckten Kosten verbunden, da die Datenbank immer noch alle übersprungenen Zeilen durchlaufen muss:

-- Page deep into the results
SELECT id FROM orders ORDER BY id LIMIT 20 OFFSET 500000;
-- 8.1 ms

-- Keyset pagination: continue from the last id seen
SELECT id FROM orders WHERE id > 500000 ORDER BY id LIMIT 20;
-- 0.01 ms

Die Keyset-Paginierung bleibt schnell, egal wie tief Sie gehen. Außerdem wird vermieden, dass Zeilen zwischen den Seiten verschoben werden, wenn neue Daten hinzugefügt werden. Der Nachteil besteht darin, dass Benutzer nicht direkt zu Seite 5.000 springen können, was selten wirklich erforderlich ist. Bei Tabellen mit breiten Zeilen oder mit mehr zu überspringenden Zeilen kann die Lücke viel größer sein als in unserem Test.

Tipp: Unsere Timings messen jeweils eine Abfrage auf einem inaktiven Computer. Unter echter Last richtet eine ineffiziente Abfrage mehr Schaden an, da sie auch Sperren hält und mit allem anderen um Speicher, Festplatte und CPU konkurriert.

Schreiben Sie schlankere Abfragen

  • Wählen Sie nur die Spalten aus, die Sie benötigen. SELECT * sendet mehr Daten und kann verhindern, dass ein Index die Abfrage abdeckt.
  • Frühzeitig filtern. Verwenden Sie WHERE, um Zeilen vor dem Gruppieren zu entfernen, und HAVING nur für Bedingungen für Aggregate. Siehe SQL GROUP BY und HAVING.
  • Verwenden Sie LIMIT, wenn Sie nur wenige Zeilen benötigen.
  • Bevorzugen Sie UNION ALL, wenn Duplikate nicht entfernt werden müssen. Unser UNION vs. UNION ALL-Test zeigt, was das spart.
  • Vermeiden Sie unnötiges DISTINCT. Oft wird ein Join ausgeblendet, der zu Duplikaten führt.
  • Verwenden Sie EXISTS für Existenzprüfungen. Es kann bei der ersten Übereinstimmung aufhören, wie unser Leitfaden zu SQL-Unterabfragen erklärt.
  • Achten Sie auf N+1 Abfragen. Eine Abfrage pro Zeile in einer Schleife, die normalerweise durch Anwendungscode verursacht wird, ist oft das eigentliche Problem. Ein einzelner Join oder eine Batch-Abfrage kann Hunderte von Roundtrips ersetzen.

Tritt bei

Indizieren Sie die Spalten, denen Sie beitreten. Wir haben einen Gesamtausgabenbericht für Kunden in einer Stadt erstellt und der Plan entsprach genau Ihren Erwartungen:

SELECT c.name, SUM(o.total)
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.city = 'Goa'
GROUP BY c.id;

-- SCAN c
-- SEARCH o USING COVERING INDEX idx_cover (customer_id=?)
-- 9,900 rows in 34 ms

Es scannt die Kunden und verwendet dann einen Index, um die Bestellungen jedes einzelnen Kunden zu finden. Ohne einen Index auf orders.customer_id müsste die Datenbank für jeden Kunden viel mehr Arbeit leisten. Ein Index für den Fremdschlüssel ist eine der häufigsten und wertvollsten Ergänzungen, die Sie vornehmen können. Um Ihr Verständnis der Grundlagen aufzufrischen, lesen Sie die Erklärung von SQL-Joins.

Wenn Indizes Sie kosten

Indizes sind nicht kostenlos, also fügen Sie nicht für jede Spalte einen hinzu:

  • Langsamere Schreibvorgänge. Bei jedem Einfügen, Aktualisieren und Löschen muss auch jeder Index aktualisiert werden.
  • Mehr Speicherplatz und Arbeitsspeicher. Indizes können auf großen Tabellen groß werden.
  • Geringe Vorteile bei nicht selektiven Spalten. Ein Index für eine wahre oder falsche Spalte hilft möglicherweise nicht, wenn die meisten Zeilen übereinstimmen.
  • Redundanz. Ein Index auf (a) ist oft unnötig, wenn Sie bereits einen auf (a, b) haben.

Überprüfen Sie regelmäßig die Nutzungsstatistiken und entfernen Sie Indizes, die nicht verwendet werden. Und halten Sie die Statistiken mit ANALYZE oder dem Äquivalent Ihrer Datenbank auf dem neuesten Stand, da der Optimierer bei der Auswahl eines guten Plans darauf angewiesen ist. Manchmal ist der langsame Teil eher der Konflikt als die Abfrage. Lang laufende Transaktionen mit Sperren können dazu führen, dass eine schnelle Abfrage langsam erscheint.

Häufige Fehler

  • Optimieren ohne zu messen. Viele sichere Vermutungen erweisen sich als falsch.
  • Testen mit winzigen Daten. Pläne und Zeitpläne ändern sich dramatisch, wenn die Tabellen wachsen.
  • Einem Tipp für eine andere Datenbank vertrauen. Ratschläge für eine Engine gelten möglicherweise nicht für eine andere.
  • Indizes blind hinzufügen. Jeder einzelne verlangsamt die Schreibvorgänge.
  • Der Erstdurchlaufeffekt wird ignoriert. Caches machen einen zweiten Durchlauf schneller, also mehrmals ausführen.

Fazit

Die meisten langsamen Abfragen haben gewöhnliche Ursachen: ein fehlender Index, eine Funktion für eine Spalte oder zu viele abgerufene Daten. Nehmen Sie Ihre langsamste echte Abfrage dieser Woche, führen Sie EXPLAIN darauf aus und suchen Sie nach einem vollständigen Scan für eine große Tabelle. Reparieren Sie eine Sache, messen Sie erneut und machen Sie sich Notizen darüber, was Sie geändert haben.

Häufige Fragen

Was ist SQL-Abfrageoptimierung?

Dabei handelt es sich um den Prozess, bei dem Abfragen weniger Zeit und weniger Ressourcen verbrauchen, in der Regel durch die Prüfung von Ausführungsplänen, das Hinzufügen geeigneter Indizes und das Umschreiben ineffizienter Abfragen.

Was ist ein Ausführungsplan?

Dabei handelt es sich um die von der Datenbank gewählte Strategie zum Ausführen einer Abfrage, einschließlich der Art und Weise, wie Tabellen gelesen werden, welche Indizes verwendet werden und in welcher Reihenfolge sie verknüpft werden.

Wie finde ich langsame Abfragen?

Aktivieren Sie das langsame Abfrageprotokoll Ihrer Datenbank oder verwenden Sie Tools wie pg_stat_statements in PostgreSQL. Konzentrieren Sie sich dann auf die Abfragen mit der höchsten Gesamtzeit.

Werden Abfragen durch das Hinzufügen eines Index immer schneller?

Nein. Es hilft beim selektiven Lesen, verlangsamt aber das Schreiben und verbraucht Speicherplatz. Der Optimierer kann es auch ignorieren, wenn die meisten Zeilen der Bedingung entsprechen.

Ist SELECT * schlecht für die Leistung?

Es kann sein. Es überträgt nicht benötigte Daten und kann verhindern, dass ein Index die Abfrage abdeckt. Normalerweise ist es besser, nur die Spalten aufzulisten, die Sie benötigen.

Lerne weiter

Arbeiten Sie mit Stack Quora

Benötigen Sie Hilfe beim Testen, WordPress oder SEO?

Wir helfen Teams, bessere Software zu liefern und ihre Websites zu erweitern. Sagen Sie uns, woran Sie gerade arbeiten, und wir schlagen Ihnen einen klaren nächsten Schritt vor.

Lesen Sie weiter

Weitere Anleitungen finden Sie unter Tests, KI und moderne Entwicklung

Hat Ihnen dieser Artikel gefallen? Wählen Sie ein Thema und springen Sie direkt in unsere neuesten Tutorials.

Künstliche Intelligenz

KI-Halluzinationen erklärt: Warum Sprachmodelle Dinge erfinden und wie man sie reduziert

KI-Halluzinationen erklärt: Was sie sind, warum Sprachmodelle sie produzieren, gängige Typen, wie man sie mit Erdung und Eingabeaufforderungen reduz…

Artikel lesen →
DevOps

Erklärte Umgebungsvariablen: .env-Dateien, Geheimnisse und Konfiguration richtig gemacht

Umgebungsvariablen anhand von Python-Beispielen erklärt, die wir ausgeführt haben: Sie lesen und festlegen, warum jeder Wert ein String ist, .env-Da…

Artikel lesen →
Softwareentwicklung

API-Ratenbegrenzung erklärt: Algorithmen, Header und Behandlung von 429-Fehlern

API-Ratenbegrenzung anhand einer von uns durchgeführten Simulation erklärt: Token-Bucket, festes Fenster, gleitendes Fenster, 429 Antworten, Ratenbe…

Artikel lesen →
Testautomatisierung

Spott in Python: unittest.mock, Patch und die Fehler, die Tests zum Lügen machen

Mocking in Python mit unittest.mock, getestet: Mock und return_value, side_effect, Patchen, wo ein Name verwendet wird, Spezifikation und Autospec, …

Artikel lesen →
Softwaretests

Code-Abdeckung erklärt: Leitungs- und Zweigstellenabdeckung und was 100 % wirklich bedeutet

Erklärung der Codeabdeckung anhand eines echten Coverage.py-Laufs: Zeilen-, Zweig- und Bedingungsabdeckung, Lesen eines Berichts, warum bei 100 % Ab…

Artikel lesen →
Datenbanken & SQL

DELETE vs. TRUNCATE vs. DROP in SQL: Unterschiede, Rollback und Verwendungszweck

DELETE vs. TRUNCATE vs. DROP erklärt mit getestetem SQL: was jeweils entfernt wird, Rollback, Trigger, Identitätsrücksetzung, Geschwindigkeit und wi…

Artikel lesen →
Datenbanken & SQL

Erklärte SQL-Ansichten: Erstellen, nutzen und vermeiden Sie Fallstricke mit Beispielen

SQL-Ansichten anhand der von uns ausgeführten Abfragen erklärt: Erstellen einer Ansicht, Live-Ergebnisse, Ausblenden von Spalten, Leistung, aktualis…

Artikel lesen →
Softwareentwicklung

TypeScript-Schnittstelle vs. Typ: Echte Unterschiede, getestet mit dem Compiler

TypeScript-Schnittstelle vs. Typ, überprüft mit dem echten Compiler: Was beide können, was nur einer kann, Deklarationszusammenführung, Erweiterunge…

Artikel lesen →
Softwareentwicklung

Python *args und **kwargs erklärt: Flexible Funktionen mit klaren Beispielen

Python *args und **kwargs erklärt mit Code, den wir ausgeführt haben: Packen und Entpacken, Parameterreihenfolge, Nur-Schlüsselwort- und Nur-Positio…

Artikel lesen →
Softwareentwicklung

Python-Lambda-Funktionen: Syntax, tatsächliche Verwendung und wann man sie nicht verwendet

Python-Lambda-Funktionen erklärt mit Code, den wir ausgeführt haben: Syntax, Sortierung mit Schlüssel, Karte und Filter, Abschlüsse, die Late-Bindin…

Artikel lesen →
Künstliche Intelligenz

Was sind KI-Agenten? Wie sie funktionieren, mit einer einfachen Agentenschleife, die Sie ausführen können

Was sind KI-Agenten? Eine einfache Anleitung zur Agentenschleife, zu Tools, Speicher und Leitplanken, mit einer kleinen Python-Schleife, die wir aus…

Artikel lesen →
DevOps

Überwachung vs. Beobachtbarkeit: Der wahre Unterschied, mit Protokollen, Metriken und Traces

Überwachung vs. Beobachtbarkeit erklärt: bekannte und unbekannte Fehler, Protokolle, Metriken und Spuren, eine exemplarische Vorgehensweise für Chec…

Artikel lesen →
DevOps

Docker-Volumes vs. Bind Mounts: Containerdaten auf die richtige Art und Weise beibehalten

Docker-Volumes vs. Bind-Mounts erklärt: Warum Containerdaten verschwinden, benannte Volumes, Bind-Mounts, tmpfs, Compose-Beispiele, Backups, Berecht…

Artikel lesen →
Testautomatisierung

TDD vs. BDD: Hauptunterschiede, eine Funktion, die auf beide Arten entwickelt wurde und wann sie jeweils verwendet werden sollte

TDD vs. BDD erklärt mit einer Rabattfunktion, die in beide Richtungen aufgebaut ist: Rot-Grün-Refaktor mit Code, den wir ausgeführt haben, Gegeben-W…

Artikel lesen →
Softwaretests

Benutzerakzeptanztests (UAT): Prozess, Checkliste und reale Beispiele

Benutzerakzeptanztests erklärt: Wer führt ihn durch, wie unterscheidet er sich von der Qualitätssicherung, ein siebenstufiger Prozess, eine UAT-Test…

Artikel lesen →
Datenbanken & SQL

Erklärte SQL-NULL-Werte: IS NULL, COALESCE, NULLIF und die zu vermeidenden Fallen

SQL-NULL-Werte, die mit von uns ausgeführten Abfragen erklärt wurden: dreiwertige Logik, IS NULL, COALESCE, NULLIF, wie Aggregate, Joins und Sortier…

Artikel lesen →
Datenbanken & SQL

SQL CASE WHEN-Anweisung: Syntax, reale Beispiele und häufige Fehler

SQL CASE WHEN anhand der von uns ausgeführten Abfragen erklärt: einfache und durchsuchte Formulare, Bedingungsreihenfolge, Pivots mit SUM, COUNT-Tri…

Artikel lesen →
Softwareentwicklung

Was ist JWT? JSON-Web-Tokens anhand eines funktionierenden Beispiels erklärt

Was ist JWT? JSON Web Tokens erklärt: die drei Teile, ein Token, das in dem von uns ausgeführten Code erstellt und manipuliert wurde, JWT vs. Sitzun…

Artikel lesen →
Softwareentwicklung

Erklärte JavaScript-Ereignisschleife: Aufrufstapel, Mikrotasks und Timer mit Beispielen

Die JavaScript-Ereignisschleife wurde mit dem von uns ausgeführten Code erklärt: Aufrufstapel, Aufgaben- und Mikrotask-Warteschlangen, warum setTime…

Artikel lesen →
Softwareentwicklung

Erklärung von Python-Generatoren und -Ertrag: Sparen Sie Speicher mit echten Beispielen

Python-Generatoren und Yield anhand des von uns ausgeführten Codes erklärt: wie sie angehalten und fortgesetzt werden, gemessene Speichereinsparunge…

Artikel lesen →
Künstliche Intelligenz

Was sind Einbettungen? Vektoren und Kosinusähnlichkeit einfach erklärt

Was sind Einbettungen? Ein Leitfaden in einfacher Sprache zu Vektoren, Kosinusähnlichkeit und semantischer Suche, mit einem kleinen Beispiel, das wi…

Artikel lesen →
DevOps

Blau-Grün vs. Canary-Bereitstellung: Unterschiede, Kompromisse und Auswahl

Blue-Green vs. Canary-Bereitstellung erklärt: Funktionsweise, Kosten, Risiko und Rollback, stabiles Benutzer-Bucketing, das wir getestet haben, Date…

Artikel lesen →
Testautomatisierung

Flaky-Tests: Was sie verursacht und wie man sie endgültig behebt

Flaky-Tests wurden anhand von Demos erklärt, die wir durchgeführt haben: die Hauptursachen, wie man sie bestätigt und diagnostiziert, richtige Korre…

Artikel lesen →
Softwaretests

Lasttest vs. Stresstest: Unterschiede, Metriken und k6-Beispiele

Erläuterungen zu Lasttests und Stresstests: Was die einzelnen Tests beweisen, Spike- und Soak-Tests, welche Kennzahlen wichtig sind, warum Durchschn…

Artikel lesen →
Softwaretests

Testfall vs. Testszenario: Hauptunterschiede, Beispiele und wann man sie jeweils verwendet

Testfall vs. Testszenario erklärt: klare Definitionen, eine Tabelle nebeneinander, eine Funktion zum Zurücksetzen von Passwörtern, die von Szenarios…

Artikel lesen →
Datenbanken & SQL

SQL-Abfrageoptimierung: Ausführungspläne lesen und langsame Abfragen mit Zeitvorgaben beheben

An einer Million Zeilen getestete SQL-Abfrageoptimierung: Ausführungspläne lesen, die richtigen Indizes hinzufügen, nicht sargierbare Filter korrigi…

Artikel lesen →
Datenbanken & SQL

SQL UNION vs. UNION ALL: Unterschiede, Beispiele und getestete Leistung

SQL UNION vs. UNION ALL anhand der von uns ausgeführten Abfragen erklärt: Duplikate, die Regeln, denen beide folgen, ein echter Datenfehler, gemesse…

Artikel lesen →
Softwareentwicklung

Tutorial zur JavaScript-Abruf-API: GET, POST, Fehlerbehandlung und Zeitüberschreitungen

Ein JavaScript-Abruf-API-Tutorial, das auf einem lokalen Server getestet wurde: GET und POST, warum 404 nicht ausgelöst wird, ein wiederverwendbarer…

Artikel lesen →
Softwareentwicklung

Umgang mit Python-Dateien: Lesen, Schreiben, CSV, JSON und Pathlib mit Beispielen

Die Handhabung von Python-Dateien wird anhand des von uns ausgeführten Codes erklärt: Öffnungsmodi, Lesen großer Dateien, CSV, JSON, Pathlib, Binärd…

Artikel lesen →
Softwareentwicklung

Python-Klassen und -Objekte: OOP-Tutorial mit echten Beispielen

Python-Klassen und -Objekte erklärt mit Code, den wir ausgeführt haben: __init__, Methoden, Klassen- und Instanzattribute, Vererbung, Eigenschaften,…

Artikel lesen →
Künstliche Intelligenz

Was ist ein großes Sprachmodell? Wie LLMs funktionieren, ohne großen Hype erklärt

Was ist ein großes Sprachmodell? LLMs im Klartext erklärt: Token, Einbettungen, Aufmerksamkeit, Training, Temperatur- und Kontextfenster, eine klein…

Artikel lesen →
DevOps

Linux-Befehle für Anfänger: Der grundlegende Terminal-Leitfaden mit Beispielen

Linux-Befehle für Anfänger, gruppiert nach Aufgaben: Navigation, Dateien, Anzeigen von Protokollen, Grep, Pipes, Berechtigungen, Prozesse und Archiv…

Artikel lesen →
Testautomatisierung

Selenium vs. Playwright: Hauptunterschiede, Code im Vergleich und welche Sie wählen sollten

Selenium vs. Playwright im Vergleich: Architektur, Wartezeit, Browser- und Sprachunterstützung, Debugging, der gleiche Test in beiden Tools, Migrati…

Artikel lesen →
Softwaretests

Äquivalenzpartitionierung: Testdesigntechnik anhand von Beispielen erklärt

Erklärung der Äquivalenzpartitionierung: Wie man gültige und ungültige Partitionen findet, Beispiele für Alter, Passwörter und Gutscheine, von uns d…

Artikel lesen →
Softwaretests

Schweregrad vs. Priorität beim Softwaretest: Unterschiede, Matrix und reale Beispiele

Schweregrad vs. Priorität beim Softwaretest erklärt: klare Definitionen, eine Vier-Wege-Matrix mit Beispielen, Stufenskalen, wer die einzelnen Punkt…

Artikel lesen →
Datenbanken & SQL

Tutorial zu SQL-Unterabfragen: Typen, korrelierte Unterabfragen und EXISTS mit Beispielen

Ein SQL-Unterabfrage-Tutorial mit Abfragen, die wir ausgeführt haben: Skalar-, IN-, FROM- und SELECT-Unterabfragen, korrelierte Unterabfragen, EXIST…

Artikel lesen →
Datenbanken & SQL

SQL-Transaktionen und ACID erklärt: COMMIT, ROLLBACK und Isolationsstufen

SQL-Transaktionen und ACID anhand einer von uns durchgeführten Banküberweisung erklärt: COMMIT, ROLLBACK, Sicherungspunkte, Sperren, Isolationsstufe…

Artikel lesen →
Softwareentwicklung

Spickzettel für Git-Befehle: Die Befehle, die Sie tatsächlich verwenden, mit Beispielen

Ein Git-Befehls-Spickzettel, gruppiert nach Aufgabe: Setup, Staging, Branches, Remotes, Stash, Verlauf und Rückgängigmachen von Fehlern, mit Ausgabe…

Artikel lesen →
Softwareentwicklung

Erklärte JavaScript-Versprechen: Dann, Catch, Promise.all und häufige Fehler

JavaScript-Versprechen erklärt mit Code, den wir ausgeführt haben: Zustände, dann und Fangketten, Fehlerbehandlung, Promise.all, allSettled, Rennen …

Artikel lesen →
Softwareentwicklung

Python-Wörterbuch-Tutorial: Methoden, Beispiele und gängige Muster

Ein Python-Wörterbuch-Tutorial mit Code, den wir ausgeführt haben: Diktate erstellen, lesen und aktualisieren, Schlüsselmethoden, Zusammenführung, V…

Artikel lesen →
Künstliche Intelligenz

Was ist RAG? Retrieval-Augmented Generation anhand eines Arbeitsbeispiels erklärt

Was ist RAG? Abruf-erweiterte Generierung Schritt für Schritt erklärt: Indizierung, Chunking, Einbettungen, Abruf, ein kleines funktionierendes Pyth…

Artikel lesen →
DevOps

Terraform-Tutorial für Anfänger: Infrastruktur als Code von der ersten Datei bis zu den Modulen

Ein Terraform-Tutorial für Anfänger: Beginnen Sie ohne Cloud-Konto, lernen Sie Init, Planen und Anwenden, dann Variablen, Ausgaben, Status, Module u…

Artikel lesen →
DevOps

Docker vs. Kubernetes: Hauptunterschiede, wie sie zusammenarbeiten und was Sie brauchen

Docker vs. Kubernetes erklärt: Was jeder tut, die gleiche App läuft mit beiden, Docker Compose und Swarm im Vergleich, die Dockershim-Änderung und w…

Artikel lesen →
Testautomatisierung

Pytest-Tutorial für Anfänger: Vorrichtungen, Parametrisierung und reale Beispiele

Ein Pytest-Tutorial für Anfänger mit Tests, die wir auf Pytest 9.2 durchgeführt haben: Assertions, Fixtures, Parametrize, Conftest, Markers, tmp_pat…

Artikel lesen →
Softwaretests

Software Testing Life Cycle (STLC): 6 Phasen, Einstiegs- und Ausstiegskriterien, Beispiel

Der Softwaretest-Lebenszyklus erklärt: sechs STLC-Phasen mit Ein- und Ausstiegskriterien, Ergebnisse, ein Beispiel für eine funktionierende Anmeldef…

Artikel lesen →
Softwareentwicklung

Git merge vs rebase: Unterschiede, Beispiele und wann man was nutzt

Git merge vs rebase erklärt mit echter Log-Ausgabe, einer Vergleichstabelle, der goldenen Regel des Rebase und einem sicheren Team-Workflow.

Artikel lesen →
Softwareentwicklung

Python List Comprehension: Syntax, Beispiele und wann man darauf verzichtet

Python List Comprehension erklärt: Syntax, Filter, if-else, verschachtelte Schleifen, gemessene Zeiten und Fälle, in denen eine normale for-Schleife…

Artikel lesen →
Datenbanken & SQL

SQL Joins erklärt mit Beispielen (Inner, Left, Right, Full)

SQL Joins Schritt für Schritt mit Beispieltabellen und Abfragen verstehen: INNER, LEFT, RIGHT, FULL, CROSS und SELF, plus typische Fehler und Perfor…

Artikel lesen →