Zum Inhalt springen

Datenbanken und betriebliche Datenmodelle – Indizes und Abfragekosten einordnen

Aus MOOCsWiki Staging
Version vom 9. Oktober 2026, 21:18 Uhr von Glanz (Diskussion | Beiträge) (aiMOOC über GPT aiMOOC Action erstellt)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
aiMOOC-Siegel aiMOOC

Datenbanken und betriebliche Datenmodelle – Indizes und Abfragekosten einordnen

QR-Code



Datenbanken und betriebliche Datenmodelle – Indizes und Abfragekosten einordnen

Zielgruppe: Ausbildung, insbesondere Fachinformatik und kaufmännische IT-Berufe

Dauer: ca. 90 Minuten

Vorkenntnisse: SQL-Grundlagen, Tabellen und Schlüssel

Kurzbeschreibung: Wie verbessern Indizes Datenbankabfragen? Welche Kosten entstehen durch Speicherbedarf und Pflege bei Änderungen?

Lernprinzip: Anschauen – Ausprobieren – Vergleichen – Begründen.


Einleitung

Ein Datenbankindex kann häufige Suchabfragen beschleunigen. Gleichzeitig benötigt er Speicherplatz und muss bei Änderungen an Daten gepflegt werden.

In diesem aiMOOC lernst Du, Nutzen und Pflegeaufwand anhand eines fiktiven betrieblichen Datenmodells abzuwägen.

Abbildung: Beispiele für Beziehungstypen in Datenmodellen. Quelle: Wikimedia Commons, Chad250, CC BY-SA 4.0.


Deine Lernziele

Nach dem Kurs kannst Du:

  1. Datenmodelle mit Primär- und Fremdschlüsseln erklären.
  2. Indizes für konkrete SQL-Abfragen vorschlagen.
  3. Abfragepläne mit SCAN und SEARCH interpretieren.
  4. Lese- und Schreibkosten gegeneinander abwägen.
  5. SQLite ausschließlich mit lokalen Testdaten untersuchen.

Sicherheitsregel: Alle praktischen Versuche verwenden erfundene Daten und lokale SQLite-Datenbanken im Arbeitsspeicher. Verwende keine Produktivdatenbank, keine Kundendaten und keine Zugangsdaten. Die Beispiele enthalten keine Netzwerkzugriffe.


Ausbildungsfall: Demo-Versandhandel

Du arbeitest im fiktiven Ausbildungsbetrieb Demo-Versandhandel.

Eine Anwendung verwaltet Kunden und Bestellungen. Die Sachbearbeitung benötigt eine schnelle Liste offener Bestellungen.

Betriebliche Anforderung:

Zeige offene Bestellungen ab einem bestimmten Datum, nach Datum sortiert.

Das System enthält im Übungslabor 80 fiktive Kunden und 6.000 künstlich erzeugte Bestellungen.


Einheit 1: Das betriebliche Datenmodell (10 Minuten)

Das vereinfachte Modell umfasst zwei Tabellen:

Tabelle Wichtige Spalten Bedeutung
kunden kunden_id, bezeichnung Kundenstammdaten
bestellungen bestell_id, kunden_id, status, bestelldatum Vorgangsdaten
KUNDEN                            BESTELLUNGEN
+----------------+                +------------------+
| kunden_id  PK   |<---------------| kunden_id   FK    |
| bezeichnung    |       1:n      | bestell_id  PK    |
+----------------+                | status           |
                                  | bestelldatum     |
                                  +------------------+

PK bezeichnet den Primärschlüssel, FK den Fremdschlüssel.

Eine Bestellung gehört zu einem Kunden. Ein Kunde kann mehrere Bestellungen besitzen.

Abbildung: Übersicht verschiedener SQL-JOIN-Arten. Quelle: Wikimedia Commons, Arbeck, CC BY 3.0.

Merke: Ein Fremdschlüssel stellt eine Beziehung dar. In SQLite entsteht dadurch nicht automatisch ein zusätzlicher Index auf der Fremdschlüsselspalte.

Mini-Auftrag: Erkläre, warum bestellungen.kunden_id kein Primärschlüssel der Bestellung ist.


Einheit 2: Was macht ein Index? (10 Minuten)

Ein Index enthält geordnet gespeicherte Suchinformationen und ermöglicht damit häufig einen gezielten Zugriff auf passende Datensätze.

Ohne passenden Index kann eine Abfrage die Tabelle vollständig durchsuchen.

Abbildung: Beispiel eines B-Baums. Quelle: Wikimedia Commons, CyHawk, CC BY-SA 3.0.

Abbildung: Verzweigte Suchstruktur eines B-Baums. Quelle: Wikimedia Commons, Flying sheep, CC BY-SA 3.0.

B-Bäume und verwandte Strukturen illustrieren das Prinzip geordneter Suchwege. Die konkrete Speicherung hängt vom Datenbanksystem ab.

Video: Fullstack Academy – Database Indexing Tutorial. Grundlagen, Nutzen und Nachteile von Indizes.


Einheit 3: Abfragekosten verstehen (15 Minuten)

Ein Datenbanksystem bewertet unterschiedliche Ausführungswege für dieselbe Abfrage.

Wichtige Kostenfaktoren sind:

  1. Selektivität: Wie viele Zeilen passen zur Suchbedingung?
  2. Datenbankindex: Welche Zugriffswege stehen zur Verfügung?
  3. Sortierung: Ist zusätzliche Sortierarbeit nötig?
  4. Speicherzugriff: Wie viele Daten- und Indexseiten müssen verarbeitet werden?
  5. Datenbankstatistik: Wie gut kann das System die Datenverteilung einschätzen?

Beispiel: Im lokalen Ausbildungsfall entstehen folgende fiktive Statushäufigkeiten:

Bestellstatus Anzahl Anteil, gerundet Visualisierung
versendet 3.800 63 % █████████████
erledigt 1.900 32 % ██████
offen 300 5 % █

Die Grafik stellt die Verteilung des später verwendeten Testdatengenerators dar.

Eine Suche nach offen ist hier selektiver als eine Suche nach versendet.

OHNE PASSENDEN INDEX

Tabellenzugriff
      |
      v
Zeilen prüfen
      |
      v
Ergebnisse auswählen
      |
      v
ggf. sortieren

MIT PASSENDEM INDEX

Indexzugriff
      |
      v
Suchbereich finden
      |
      v
passende Indexeinträge lesen
      |
      v
ggf. Tabellenzeilen nachladen

Schematische Darstellung, kein gemessener Ausführungsplan.

Wichtig: Ein Index garantiert keine schnellere Abfrage. Bei kleinen Tabellen oder sehr vielen passenden Zeilen kann ein vollständiger Scan günstiger sein.


Einheit 4: Abfragepläne lesen (10 Minuten)

SQLite stellt mit EXPLAIN QUERY PLAN Informationen über den geplanten Datenzugriff bereit.

Anzeige Bedeutung
SCAN Ein Datenbereich wird durchlaufen; häufig ein vollständiger Tabellenscan.
SEARCH Eine Teilmenge wird gezielt gesucht.
USING INDEX Ein Index wird verwendet.
USING COVERING INDEX Die benötigten Werte können aus dem Index bereitgestellt werden.
USE TEMP B-TREE FOR ORDER BY Eine zusätzliche temporäre Sortierstruktur wird verwendet.

Achtung: SCAN bedeutet nicht immer, dass kein Index benutzt wird. SQLite kann auch einen Index vollständig durchlaufen. Außerdem kann sich die Textausgabe zwischen SQLite-Versionen ändern.

Video: Liv4IT – SQLite Index und EXPLAIN QUERY PLAN praktisch anwenden.


Einheit 5: Pflegeaufwand und Entscheidung (10 Minuten)

Animation: Einfügevorgänge in einem B+-Baum. Quelle: Wikimedia Commons, GavinRay97, CC BY-SA 4.0.

Abbildung: B-Baum mit Einfügebeispiel. Quelle: Wikimedia Commons, Maxtremus, gemeinfrei.

Ein zusätzlicher Index beansprucht Speicher und muss bei passenden Schreibvorgängen aktualisiert werden.

Vorgang Möglicher Nutzen Möglicher Aufwand
SELECT Gezielte Suche und Sortierung Indexlesen und gegebenenfalls zusätzliche Tabellenzugriffe
INSERT Kein unmittelbarer Suchvorteil Neue Indexeinträge pflegen
UPDATE Spätere Suche kann profitieren Betroffene Indexeinträge aktualisieren
DELETE Spätere Abfragen können profitieren Einträge aus Indizes entfernen

Entscheidungsregel: Häufige selektive Abfragen sprechen für geeignete Indizes. Häufige Schreiboperationen und wenig genutzte Indizes sprechen für Zurückhaltung.

Video: Mycelial – SQLite Indexes, beyond the basics. Vertiefung zu Indexvarianten.


Lokale und isolierte Testumgebungen

Alle Testumgebungen verwenden ausschließlich künstliche Daten. Es wird kein Server kontaktiert und keine vorhandene Datenbankdatei verändert.


Testumgebung A: Kleine SQLite-Sandbox

Voraussetzung: Lokal installierte SQLite-Kommandozeile.

Starte im Terminal:

sqlite3 :memory:

Gib anschließend diese Befehle in der lokalen SQLite-Sitzung ein:

CREATE TABLE testauftraege (
    id INTEGER PRIMARY KEY,
    status TEXT NOT NULL,
    datum TEXT NOT NULL
);

INSERT INTO testauftraege VALUES
(1, 'offen', '2026-10-01'),
(2, 'versendet', '2026-10-02'),
(3, 'offen', '2026-10-03'),
(4, 'erledigt', '2026-10-04');

EXPLAIN QUERY PLAN
SELECT id, datum
FROM testauftraege
WHERE status = 'offen';

CREATE INDEX ix_test_status
ON testauftraege(status);

EXPLAIN QUERY PLAN
SELECT id, datum
FROM testauftraege
WHERE status = 'offen';

DROP INDEX ix_test_status;

Beobachtungsauftrag: Vergleiche beide Pläne. Bei nur vier Datensätzen darf SQLite auch mit vorhandenem Index einen Tabellenscan wählen.

Hilfe 1: Suche nach SCAN, SEARCH und USING INDEX.

Hilfe 2: Berücksichtige die geringe Tabellengröße.

Begründetes Feedback: Falls weiterhin SCAN erscheint, ist das kein Fehler. Der Optimierer entscheidet nach geschätzten Kosten, nicht allein nach der Existenz eines Index.

Die Datenbank verschwindet beim Beenden der SQLite-Sitzung.


Testumgebung B: Interaktives Python-SQLite-Labor

Voraussetzung: Lokal installiertes Python 3 mit dem Standardmodul sqlite3.

Speichere den folgenden vollständigen Code als index_labor.py. Starte ihn mit python3 index_labor.py beziehungsweise unter Windows mit py index_labor.py.

Das Programm erzeugt für jeden Versuch eine neue Datenbank im Arbeitsspeicher.

import sqlite3
from time import perf_counter

ABFRAGE = """
SELECT bestell_id, status, bestelldatum
FROM bestellungen
WHERE status = 'offen'
  AND bestelldatum >= '2026-09-15'
ORDER BY bestelldatum
LIMIT 5
"""

def neue_datenbank(mit_index):
    db = sqlite3.connect(":memory:")
    db.execute("PRAGMA foreign_keys = ON")
    db.execute("PRAGMA temp_store = MEMORY")

    db.executescript("""
        CREATE TABLE kunden (
            kunden_id INTEGER PRIMARY KEY,
            bezeichnung TEXT NOT NULL
        );

        CREATE TABLE bestellungen (
            bestell_id INTEGER PRIMARY KEY,
            kunden_id INTEGER NOT NULL
                REFERENCES kunden(kunden_id),
            status TEXT NOT NULL,
            bestelldatum TEXT NOT NULL
        );
    """)

    db.executemany(
        "INSERT INTO kunden VALUES (?, ?)",
        ((i, f"Demo-Firma {i:02d}")
         for i in range(1, 81))
    )

    db.executemany(
        "INSERT INTO bestellungen VALUES (?, ?, ?, ?)",
        (
            (
                i,
                (i % 80) + 1,
                "offen" if i % 20 == 0 else
                ("erledigt" if i % 3 == 0 else "versendet"),
                f"2026-09-{(i % 28) + 1:02d}"
            )
            for i in range(1, 6001)
        )
    )

    db.commit()

    if mit_index:
        db.execute("""
            CREATE INDEX ix_status_datum
            ON bestellungen(status, bestelldatum)
        """)

    db.execute("ANALYZE")
    db.commit()
    return db


def lesetest(db):
    print("\nAbfrageplan:")
    for zeile in db.execute(
        "EXPLAIN QUERY PLAN " + ABFRAGE
    ):
        print(" ", zeile[3])

    print("\nErste Treffer:")
    for zeile in db.execute(ABFRAGE):
        print(" ", zeile)

    start = perf_counter()
    for _ in range(150):
        db.execute(ABFRAGE).fetchall()

    dauer = (perf_counter() - start) * 1000
    print(f"\n150 SELECT-Abfragen: {dauer:.2f} ms")


def schreibtest(db):
    daten = [
        (10001 + i, 1, "offen", "2026-09-20")
        for i in range(1000)
    ]

    db.execute("SAVEPOINT pruefung")

    start = perf_counter()
    db.executemany(
        "INSERT INTO bestellungen VALUES (?, ?, ?, ?)",
        daten
    )
    dauer = (perf_counter() - start) * 1000

    db.execute("ROLLBACK TO pruefung")
    db.execute("RELEASE pruefung")

    anzahl = db.execute(
        "SELECT COUNT(*) FROM bestellungen"
    ).fetchone()[0]

    print(f"\n1000 INSERT-Vorgänge: {dauer:.2f} ms")
    print(f"Bestellungen nach Rollback: {anzahl}")


while True:
    print("\n=== SQLite-Indexlabor ===")
    print("1 - Lesetest ohne Index")
    print("2 - Lesetest mit Index")
    print("3 - Schreibtest ohne Index")
    print("4 - Schreibtest mit Index")
    print("0 - Beenden")

    try:
        wahl = input("Deine Auswahl: ").strip()
    except EOFError:
        break

    if wahl == "0":
        break

    if wahl not in {"1", "2", "3", "4"}:
        print("Bitte 0 bis 4 eingeben.")
        continue

    db = neue_datenbank(wahl in {"2", "4"})
    try:
        if wahl in {"1", "2"}:
            lesetest(db)
        else:
            schreibtest(db)
    finally:
        db.close()

print("Das lokale Labor ist beendet.")

Sicherheit: Das Programm verwendet nur Python-Standardbibliotheken, erzeugt fiktive Daten und verbindet sich mit keinem Netzwerk. Schreibtests werden zurückgerollt. Die Testdaten bleiben nicht dauerhaft gespeichert.


Visualisierte Laborergebnisse

Versuch Ohne Index Mit Index Was beobachtest Du?
Lesezugriff Menü 1 Menü 2 Abfrageplan und Messzeit
Schreibzugriff Menü 3 Menü 4 Zeit für 1.000 INSERT-Vorgänge
Datenbestand 6.000 6.000 Nach jedem Versuch unverändert

Wichtig: Die Zeiten werden auf Deinem Computer gemessen. Sie sind keine allgemeingültigen Leistungswerte. Wiederhole die Versuche in wechselnder Reihenfolge. Kleine Messzeitunterschiede können durch Systemlast und Messrauschen entstehen.


Anwendungsauftrag: Index begründen

Untersuche diese Abfrage aus dem Versandhandel:

SELECT bestell_id, status, bestelldatum
FROM bestellungen
WHERE status = 'offen'
  AND bestelldatum >= '2026-09-15'
ORDER BY bestelldatum
LIMIT 5;

Vergleiche sie mit folgendem Index:

CREATE INDEX ix_status_datum
ON bestellungen(status, bestelldatum);

Hilfe 1: Identifiziere zuerst die Bedingungen in WHERE.

Hilfe 2: Prüfe danach, ob die Indexreihenfolge zur Suche und Sortierung passt.

Hilfe 3: Vergleiche die tatsächlichen Pläne aus Menü 1 und Menü 2.

Begründetes Feedback: Der Index beginnt mit der Gleichheitsbedingung auf status und führt anschließend bestelldatum. Dadurch kann SQLite passende Einträge in Datumsreihenfolge lesen. Für die gezeigte SELECT-Abfrage sind die benötigten Werte im Index einschließlich der Zeilenkennung verfügbar. SQLite kann deshalb einen abdeckenden Indexzugriff verwenden.


Transfer: Wann lohnt sich ein Index nicht?

Stelle Dir eine zweite Tabelle vor, in die pro Minute sehr viele neue Sensormeldungen geschrieben werden. Eine Auswertung findet nur selten statt.

Hilfe 1: Unterscheide Lese- und Schreiboperationen.

Hilfe 2: Jeder zusätzliche Index muss bei betroffenen Änderungen gepflegt werden.

Begründetes Feedback: Bei hoher Schreibrate können zusätzliche Indexaktualisierungen relevanter sein als seltene Lesevorteile. Die Entscheidung hängt jedoch auch von Datenmenge, Aufbewahrungsdauer und Anforderungen an die Abfragezeit ab. Ein kontrollierter Test ist aussagekräftiger als eine pauschale Regel.


Interaktive Aufgaben


Quiz: Teste Dein Wissen

Wozu dient ein Datenbankindex hauptsächlich? (Zum gezielten Auffinden von Datensätzen) (!Zum automatischen Verschlüsseln aller Daten) (!Zum Ersetzen der gesamten Tabelle) (!Zum Löschen nicht benötigter Daten)




Was bedeutet SEARCH im SQLite-Abfrageplan? (Eine Teilmenge wird gezielt gesucht) (!Alle Daten werden automatisch gelöscht) (!Die Datenbank wird neu installiert) (!Jede Abfrage wird vollständig gespeichert)




Welche Aussage über die Existenz eines Index ist richtig? (Der Optimierer entscheidet über dessen Verwendung) (!Ein Index wird bei jeder SELECT-Abfrage benutzt) (!Ein Index macht jede Abfrage garantiert schneller) (!Ein Index verhindert grundsätzlich einen Tabellenscan)




Was ist bei einem Fremdschlüssel in SQLite richtig? (Er erzeugt nicht automatisch einen Index auf der Kindtabelle) (!Er darf niemals in Abfragen vorkommen) (!Er ist immer der Primärschlüssel der Kindtabelle) (!Er sortiert automatisch sämtliche Datensätze)




Was kennzeichnet einen abdeckenden Index? (Er enthält die für die Abfrage benötigten Werte) (!Er verschlüsselt alle Tabellenspalten) (!Er ersetzt sämtliche Fremdschlüssel) (!Er verhindert jede Schreiboperation)




Welche Suchbedingung ist im gezeigten Ausbildungsfall selektiver? (Die Suche nach offenen Bestellungen) (!Die Suche nach versendeten Bestellungen) (!Jede Suche ist gleich selektiv) (!Die Auswahl aller Bestellungen)




Warum erhöhen zusätzliche Indizes den Pflegeaufwand? (Indexeinträge müssen bei betroffenen Änderungen gepflegt werden) (!Indizes werden bei jedem SELECT gelöscht) (!Indizes benötigen grundsätzlich einen externen Server) (!Indizes verhindern das Einfügen neuer Zeilen)




Wozu dient ANALYZE in SQLite? (Zum Sammeln von Statistiken für die Abfrageplanung) (!Zum vollständigen Löschen der Datenbank) (!Zum automatischen Export aller Kundendaten) (!Zum Erstellen von Netzwerkverbindungen)




Welcher Befehl zeigt in SQLite einen vereinfachten Abfrageplan? (EXPLAIN QUERY PLAN) (!DROP DATABASE) (!DELETE INDEX) (!FORMAT TABLE)




Wann kann ein Tabellenscan sinnvoll sein? (Bei einer sehr kleinen Tabelle) (!Nur wenn SQL grundsätzlich fehlerhaft ist) (!Ausschließlich bei beschädigten Datensätzen) (!Niemals bei korrekt aufgebauten Datenbanken)





Memory

Primärschlüssel Eindeutige Kennzeichnung eines Datensatzes
Fremdschlüssel Verweis auf einen Schlüssel einer anderen Tabelle
Index Zusätzliche Struktur für effiziente Suchzugriffe
Tabellenscan Durchlaufen eines gesamten Tabellenbereichs
Abdeckender Index Bereitstellung aller benötigten Abfragewerte
Pflegeaufwand Zusätzliche Arbeit bei Datenänderungen
Abfrageoptimierer Auswahl eines geschätzten günstigen Ausführungsplans





Drag and Drop

Ordne die richtigen Begriffe zu. Beschreibung
SCAN Durchlaufen eines Datenbereichs
SEARCH Gezieltes Auffinden einer Teilmenge
CREATE INDEX Anlegen einer Indexstruktur
DROP INDEX Entfernen einer Indexstruktur
ANALYZE Sammeln von Datenbankstatistiken
INSERT Einfügen neuer Datensätze





Kreuzworträtsel

Index Welche zusätzliche Datenstruktur kann Suchabfragen beschleunigen?
Schema Wie heißt die formale Beschreibung des Datenbankaufbaus?
Statistik Welche Information unterstützt die Schätzung von Abfragekosten?
Sortierung Welcher Vorgang bringt Ergebnisse in eine gewünschte Reihenfolge?
Fremdschluessel Welcher Schlüssel stellt einen Verweis auf einen Schlüssel einer anderen Tabelle her?
Tabellenscan Wie heißt das vollständige Durchlaufen einer Tabelle?





LearningApps

Optionale externe Lernangebote zum Thema. Verwende dort keine persönlichen Daten, Zugangsdaten oder betrieblichen Daten.


Lückentext

Vervollständige den Text.
Ein relationales Datenmodell organisiert Informationen in

.
Ein

kennzeichnet einen Datensatz eindeutig.
Ein

beschreibt einen Bezug zu einem Schlüssel einer anderen Tabelle.
Ein Datenbankindex kann den

beschleunigen.
Ein vollständiger Tabellendurchlauf heißt

.
Eine gezielte Teilmengensuche erscheint in SQLite häufig als

.
Die Anweisung zum Erstellen eines Index beginnt mit

.
Ein Index mit mehreren Spalten heißt

.
Ein Index verursacht zusätzlichen

.
Bei Schreiboperationen können Indexeinträge

werden.
SQLite kann mit

Statistiken für die Abfrageplanung sammeln.
Die passende Indexwahl hängt auch von der

ab.
}




Offene Aufgaben

Bearbeite zwölf Aufgaben in aufsteigender Schwierigkeit. Verwende bei praktischen Tests ausschließlich die bereitgestellten lokalen Daten.


Leicht – Basisaufgaben

  1. Tabellenmodell: Zeichne die Tabellen kunden und bestellungen mit ihren Beziehungen.
  2. Primärschlüssel: Markiere Primär- und Fremdschlüssel im Ausbildungsfall und erläutere ihren Zweck.
  3. SQL: Formuliere eine SELECT-Abfrage für alle offenen Bestellungen.
  4. Datenbankindex: Erstelle eine einfache Infografik, die Tabellen- und Indexsuche gegenüberstellt.


Standard – Anwendungsaufgaben

  1. Abfrageplan: Führe die Lesetests aus und dokumentiere beide EXPLAIN-QUERY-PLAN-Ausgaben.
  2. Mehrspaltenindex: Prüfe, warum die Reihenfolge status und bestelldatum für die Beispielabfrage geeignet ist.
  3. SQLite: Vergleiche die Schreibtests mit und ohne Index und dokumentiere die Messbedingungen.
  4. Datenvisualisierung: Gestalte ein Balkendiagramm aus den drei Statushäufigkeiten und erkläre deren Bedeutung für Suchbedingungen.


Schwer – Transferaufgaben

  1. Datenbankoptimierung: Erstelle einen begründeten Indexvorschlag für eine neue Abfrage nach kunden_id.
  2. Datenmodellierung: Erweitere das fiktive Datenmodell um Bestellpositionen und prüfe mögliche zusätzliche Indexanforderungen.
  3. Systemanalyse: Entwickle eine Entscheidungsmatrix für ein leseintensives und ein schreibintensives System.
  4. Projektarbeit: Produziere ein kurzes Erklärvideo oder ein technisches Beratungspapier zur Frage, wann zusätzliche Indizes nützlich oder nachteilig sind.




Text bearbeiten Bild einfügen Video einbetten Interaktive Aufgaben erstellen



Gestufte Hilfen und begründetes Feedback

Bearbeite die Aufgaben zunächst selbstständig. Nutze die Hilfen erst, wenn Du nicht weiterkommst.

Niveau Erste Hilfe Vertiefende Hilfe Begründetes Feedback
Basis Unterscheide Tabellen, Schlüssel und Zugriffsstrukturen. Markiere kunden.kunden_id und bestellungen.kunden_id. Ein korrektes Modell zeigt die 1:n-Beziehung. Der Fremdschlüssel sichert die Zuordnung, ersetzt aber keinen automatisch angelegten Suchindex auf der Kindtabelle.
Anwendung Vergleiche dieselbe SQL-Abfrage vor und nach der Indexerstellung. Untersuche SCAN, SEARCH, Sortierung und die tatsächlichen Laufzeiten. Eine begründete Lösung verwendet den beobachteten Ausführungsplan. Einzelne Laufzeiten allein reichen wegen Messrauschen und veränderlicher Systemlast nicht aus.
Transfer Berücksichtige die Häufigkeit von SELECT und INSERT. Vergleiche Suchvorteile, Speicherbedarf und Änderungsaufwand. Eine gute Empfehlung nennt Bedingungen und Grenzen. Zusätzliche Indizes sind nicht automatisch besser, insbesondere wenn ihre Pflegekosten den tatsächlichen Abfragenutzen übersteigen.


Lernkontrolle

Bearbeite diese Aufgaben ohne vorgegebene Musterlösung. Entscheidend sind nachvollziehbare Begründungen und die Übertragung auf neue Situationen.

  1. Abfrageoptimierung: Eine Tabelle wächst von wenigen Hundert auf mehrere Millionen Datensätze. Erkläre, warum sich die günstigste Zugriffsstrategie ändern kann.
  2. Indexstrategie: Eine Anwendung liest selten, schreibt jedoch fortlaufend neue Daten. Entwickle eine begründete Entscheidung über zusätzliche Indizes.
  3. Datenbankstatistik: Nach einer starken Änderung der Datenverteilung wählt SQLite einen unerwarteten Abfrageplan. Beschreibe ein methodisches Vorgehen zur Untersuchung.
  4. Relationales Datenmodell: Eine neue Abfrage verbindet Kunden und Bestellungen. Analysiere, welche Spalten für zusätzliche Indizes infrage kommen und warum.
  5. Abfragekosten: Zwei Versuche zeigen unterschiedliche Messzeiten, aber identische Ergebnisse. Erläutere, welche weiteren Beobachtungen für eine belastbare Bewertung erforderlich sind.
  6. IT-Sicherheit: Ein Ausbildungsbetrieb möchte Indexoptimierung auf einer Produktivdatenbank erproben. Entwickle einen sicheren Testprozess mit synthetischen Daten in einer autorisierten lokalen Umgebung.


Lernnachweis

Für einen erfolgreichen Lernnachweis erstellst Du eine kurze technische Dokumentation mit folgenden Bestandteilen:

  1. Datenmodell: Zwei Tabellen, Beziehung, Primärschlüssel und Fremdschlüssel korrekt darstellen.
  2. SQL-Nachweis: Eine geeignete Suchabfrage und einen passenden Index formulieren.
  3. Versuchsdokumentation: Lokale Abfragepläne und selbst ermittelte Messwerte festhalten.
  4. Kostenbewertung: Suchnutzen, Sortieraufwand, Speicherbedarf und Schreibaufwand erläutern.
  5. Transfer: Einen begründeten Indexentscheid für einen neuen betrieblichen Anwendungsfall treffen.
  6. Sicherheit: Nachweisen, dass nur fiktive Daten in einer isolierten Testumgebung verwendet wurden.
  7. Reflexion: Unsicherheiten und Grenzen der Messergebnisse benennen.

Bewertungskriterien: Fachliche Richtigkeit, Nachvollziehbarkeit der Versuche, Qualität der Begründung und eigenständige Übertragung.




OERs zum Thema

Der folgende Wikipedia-Artikel bietet ergänzende Informationen zum Datenbankindex.


Fachlich geprüfte Quellen

  1. SQLite – Query Planning: Offizielle Erklärung von Indexzugriffen, Mehrspaltenindizes, Sortierung und Kostenabschätzung.
  2. SQLite – EXPLAIN QUERY PLAN: Offizielle Dokumentation zur Interpretation von SCAN, SEARCH und abdeckenden Indizes.
  3. SQLite – ANALYZE: Offizielle Informationen zur Erhebung von Optimiererstatistiken.
  4. SQLite – Foreign Key Support: Fremdschlüssel, Integritätsregeln und empfohlene Indizes.
  5. SQLite – CREATE INDEX: Offizielle Syntax der Indexerstellung.
  6. PostgreSQL – Indexes: Ergänzende systemübergreifende Darstellung des Nutzen-Kosten-Verhältnisses von Indizes.
  7. Wikipedia – Datenbankindex: Allgemeiner Überblick über Indexstrukturen und deren Einsatz.

Die praktischen Beispiele sind ausdrücklich für SQLite formuliert. Abfragepläne, Indextypen und Optimierungsverhalten können sich bei anderen Datenbanksystemen unterscheiden.


Bildnachweise und Medienrechte

Die folgenden Wikimedia-Commons-Dateien wurden anhand ihrer Dateibeschreibungen und Lizenzangaben ausgewählt:

Medium Urheber Lizenz
Entity Relationship Diagram Examples.png Chad250 CC BY-SA 4.0
SQL Joins.svg Arbeck CC BY 3.0
B-tree.svg CyHawk CC BY-SA 3.0
B-Baum.svg Flying sheep CC BY-SA 3.0
B+ Tree insertion visualization.gif GavinRay97 CC BY-SA 4.0
B tree insertion example.png Maxtremus Gemeinfrei

Die YouTube-Videos sind als externe Medien eingebettet und werden nicht als frei lizenzierte OER ausgegeben. Die jeweilige Nachnutzung richtet sich nach den Rechten der Urheber und den Nutzungsbedingungen der Plattform.

Datenschutzhinweis: Beim Laden externer Videos, Wikipedia- oder LearningApps-Inhalte können Verbindungsdaten an die jeweiligen Anbieter übertragen werden. Die SQLite-Übungen selbst benötigen keine externe Verbindung.


Verknüpfte Lernbereiche


aiMOOC-Projekte



Schulfach+




aiMOOCs



aiMOOC Projekte









MOOCwiki · Deutsch

Nach dem Lernen ist vor dem Lernen

Entdecke direkt den nächsten Lernkurs. Weitere Inhalte erscheinen, wenn Du weiter nach unten scrollst.

Zur MOOCwiki-Hauptseite

Mediathek

Inhalte werden geladen ...

Mediathek wird aus dem Wiki geladen ...