OLTP und OLAP
Kurz gesagt: OLTP sind die vielen kleinen Abfragen einer Anwendung wie einer Kasse, und OLAP sind die wenigen großen Berichtsabfragen, die alle Zeilen lesen.
Problem
Die Kasse und die Buchhaltung
Die Datenbank des Shops macht zwei sehr verschiedene Aufgaben gleichzeitig. Der Kunde an der Kasse fragt nach einer Bestellung und will die Antwort sofort. Der Inhaber fragt am Montagmorgen „wie viel haben wir pro Monat und pro Kategorie verkauft“, und dafür braucht es alle Bestellungen des Jahres.
Die ersten sind tausende pro Minute, klein und über einen Schlüssel. Die zweiten sind ein paar am Tag, aber jede liest alles. Dieselbe Datenbank ist selten in beidem gut. Deshalb gibt es verschiedene Arten von Datenbanken, und um sie geht es in diesem Modul.
Die Idee
OLTP: viele kleine Abfragen
OLTP (online transaction processing) ist die Aufgabe der Kasse: ein paar Zeilen lesen oder ändern, die du über einen Schlüssel kennst. Die Produkte in Bestellung 42:
Der Plan zeigt, dass die Datenbank nicht die ganze Tabelle liest. Sie sucht (SEARCH) mit dem Index des Primärschlüssels und geht direkt zu den zwei Zeilen:
OLTP-Abfragen schreiben auch. Ein Kauf ist eine Transaktion: Die Bestellung, ihre Zeile und der Bestand werden zusammen geschrieben oder gar nicht:
Probier es aus
Der Kunde fragt nach
Der Kunde ruft wegen Bestellung 15 an. Zeige ihren Status und ihr Datum (die Spalten status und ordered_at).
Lösung
SELECT status, ordered_at FROM orders WHERE id = 15;WHERE id = 15: Die Bestellnummer ist der Primärschlüssel, und die Datenbank geht direkt zur Zeile. customer_id = 15 sucht die Bestellungen von Kunde 15, und das ist eine andere Frage. Die Prüfung sieht sich auch den Plan an: Eine Abfrage, die die ganze Tabelle liest, besteht nicht.
Die Idee
OLAP: wenige große Abfragen
OLAP (online analytical processing) ist die Aufgabe der Analyse: viele Zeilen sammeln, gruppieren und vergleichen. Der Umsatz pro Monat für 2026:
Ein Schlüssel hilft hier nicht. Der Bericht braucht alle Bestellzeilen, deshalb beginnt der Plan mit SCAN:
Bei 152 Zeilen ist das sofort fertig. Bei 50 Millionen Zeilen liest der Bericht Gigabytes und belastet Platte, Speicher und Prozessor minutenlang. Währenddessen wartet die Kasse. Und ein Index hilft nicht, weil der Bericht ohnehin alles will.
Die Idee
Das Data Warehouse
Die Lösung ist, dass die Berichte die Datenbank der Website nicht anfassen. Jede Nacht kopiert ein Programm die Daten in eine eigene Datenbank für die Analyse, das Data Warehouse. Das Kopieren heißt ETL: extract, transform, load (extrahieren, umwandeln, laden).
Beim Umwandeln werden die Tabellen meist zu einer breiten Tabelle zusammengeführt: alles zu einem Verkauf in einer Zeile. Das ist Denormalisierung, die in der Datenbank der Website ein Fehler wäre: Der Name des Produkts wiederholt sich in jeder Zeile. Hier ist es Absicht, weil die Daten nur gelesen werden und der Bericht kein JOIN braucht. CREATE TABLE … AS SELECT macht aus dem Ergebnis einer Abfrage eine neue Tabelle:
Die stornierten Bestellungen werden schon beim Kopieren entfernt, damit die Berichte nicht an sie denken müssen.
Genauer, für Neugierige
Echte Data Warehouses (ClickHouse, BigQuery, Snowflake, Amazon Redshift) speichern die Daten spaltenweise, nicht zeilenweise. Ein Umsatzbericht liest nur die Spalten day, category und amount und überspringt den Rest. Dafür ist die Lektion über spaltenorientierte Datenbanken da. Die breite Tabelle ist meist eine „Faktentabelle“ mit kleinen Nachschlagetabellen drumherum (Dimensionen: Datum, Produkt, Filiale), und das Ganze heißt Sternschema.
Probier es aus
Ein Bericht pro Kategorie
Aus der Tabelle sales: der Umsatz pro Kategorie für 2026 (die Spalten category und revenue, auf Cent gerundet), vom größten abwärts.
Lösung
SELECT category, ROUND(SUM(amount), 2) AS revenue
FROM sales
WHERE day >= '2026-01-01'
GROUP BY category
ORDER BY revenue DESC;SUM(amount) mit GROUP BY category und WHERE day >= '2026-01-01'. Ohne die Bedingung zum Jahr ist die Summe für alle Zeit, seit September 2025. In sales gibt es kein JOIN: Die Kategorie steht schon in der Zeile.
Übung
Wie viele Bestellungen pro Stadt
Aus der Tabelle sales: wie viele Bestellungen es aus jeder Stadt gibt (die Spalten city und orders), die meisten zuerst, bei Gleichstand nach dem Namen der Stadt. Ein Kunde ohne Stadt ist eine Zeile mit NULL.
Lösung
SELECT city, COUNT(DISTINCT order_id) AS orders
FROM sales
GROUP BY city
ORDER BY orders DESC, city;COUNT(DISTINCT order_id). In der breiten Tabelle ist jede Zeile ein Produkt einer Bestellung, und eine Bestellung mit drei Produkten sind drei Zeilen. COUNT(*) zählt die Zeilen und ergibt 50 für Sofia, während es 23 Bestellungen sind. Das ist der häufigste Fehler bei breiten Tabellen.
Die Idee
Die Art der Daten und die Art der Frage
OLTP und OLAP sind die erste Trennung. Die übrigen ergeben sich daraus, wie die Daten aussehen und was du sie fragst. Jede Lektion des Moduls ist ein solches Paar, und die meisten haben einen Simulator der echten Datenbank im Browser:
| Die Daten und die Frage | Art der Datenbank | Beispiele |
|---|---|---|
| Ich hole über einen Schlüssel, schnell, oft | Key-Value | Redis, Valkey, DynamoDB |
| Ein ganzes Dokument mit verschachtelten Teilen | Dokumentendatenbank | MongoDB |
| Was geschehen ist und in welcher Reihenfolge | Ereignisstrom | Kafka, Redpanda |
| Wer mit wem verbunden ist, in wie vielen Schritten | Graph | Neo4j |
| Summen über Millionen Zeilen, über die Zeit | spaltenorientiert, Zeitreihen | ClickHouse, TimescaleDB |
| Wörter im Text | Volltextsuche | Elasticsearch, OpenSearch |
| Ähnlich in der Bedeutung | Vektor | pgvector, Qdrant |
| Mehr Daten und Abfragen, als ein Server verkraftet | Cluster | Replikation, Sharding |
Am Ende steht die Lektion, wie du wählst. Die Antwort ist fast immer: eine relationale Datenbank für die Wahrheit und eine andere Art daneben, nur für die Frage, bei der sie schwach ist.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: ACID: alles oder nichts · BEGIN, COMMIT, ROLLBACK · Indizes · EXPLAIN: der Abfrageplan
- Geht weiter in: Key-Value und der Cache · Graphdatenbanken · Spaltenorientierte Datenbanken und Zeitreihen · Wie du eine Datenbank wählst
- Aufgaben zum Thema: Arten von Datenbanken