Direkt zum Inhalt

DuckDB vs SQLite: Ein kompletter Datenbankvergleich

Lerne die wichtigsten Unterschiede zwischen DuckDB und SQLite kennen und finde heraus, wie sie im Vergleich zueinander abschneiden.
Aktualisierte 7. Nov. 2025  · 15 Min. Lesezeit

Im modernen Datenmanagement spielen leichtgewichtige eingebettete Datenbanken eine wichtige Rolle bei der Unterstützung von Anwendungen, Arbeitsabläufen und Analysen. Zwei Systeme, die oft miteinander verglichen werden, sind DuckDB und SQLite

Beide sind eingebettete Datenbanken, aber sie haben unterschiedliche Aufgaben: SQLite ist super für Transaktions-Workloads, während DuckDB für analytische Abfragen optimiert ist.

In diesem Vergleichsartikel schauen wir uns an, wie sich die beiden Datenbanken voneinander unterscheiden.

Auf einen Blick: DuckDB vs SQLite

Hier ist 'ne Tabelle, die zeigt, was DuckDB und SQLite gemeinsam haben und wo sie sich unterscheiden. Für alle Details check einfach die Erklärungen in diesem Artikel. 

Kategorie SQLite DuckDB
Erscheinungsjahr 2000 2019
Hauptzweck Leichte Transaktionsdatenbank (OLTP) Eingebettete analytische Datenbank (OLAP)
Speichermodell Zeilenbasiert Säulenförmig
Art der Arbeitsbelastung OLTP (Einfügen, Aktualisieren, Löschen, Punktabfragen) OLAP (Aggregationen, Verknüpfungen, Scans)
Abfrageausführung Iterator-basiert (Zeile für Zeile) Vektorisiert (Batch-Verarbeitung)
Leistung Stärke Super für kleine, häufige Transaktionen Super für analytische Abfragen bei großen Datensätzen
Parallelitätsmodell Einzelner Autor, mehrere Leser Parallele Abfrageausführung über CPU-Kerne hinweg
Umgang mit der Datengröße Optimiert für kleine bis mittelgroße Datensätze Kann mit Datensätzen umgehen, die größer als der Arbeitsspeicher sind (Out-of-Core-Ausführung)
Unterstützte Dateiformate Nur proprietäre SQLite-Datei Native Unterstützung für Parquet, Arrow und CSV
Zugriff auf externe Daten Muss vor der Abfrage importiert werden Dateien direkt abfragen, ohne sie zu importieren
Integrationen Breite Sprachunterstützung (C, Python, Java, PHP usw.) Tiefgehende Datenwissenschaftsintegration (Python, R, Pandas, Jupyter)
Cloud Integration Lokal zuerst, eingeschränkte Cloud-Funktionen Native S3-, Azure- und GCS-Integration für Parquet/Arrow
Transaktionen & ACID Vollständig ACID-konform ACID innerhalb eines einzelnen Prozesses, weniger robust bei gleichzeitigen Schreibvorgängen
Einrichtung & Abhängigkeiten Keine Konfiguration nötig, eine einzige C-Bibliothek Einfach zu installieren, aber mit optionalen Abhängigkeiten (Arrow, Pandas)
SQL-Funktionen CRUD-fokussiert; teilweise Unterstützung für analytisches SQL Starke ANSI-SQL-Unterstützung mit fortgeschrittenen Analysen (CTEs, Fensterfunktionen)
Typische Anwendungsfälle Mobile Apps, IoT-Geräte, lokale Caches Datenwissenschaft, BI-Dashboards, ETL-Pipelines
Skalierbarkeit Nur für Single-Thread-Ausführung Multi-Core-Parallelität und Disk Spill für große Workloads
Wartung Minimal; ab und zu mal VACUUM, um Speicherplatz freizumachen Minimal; partitionierte Parquet-Verwaltung für mehr Effizienz
Am besten geeignet für Eingebettete Apps, die zuverlässigen lokalen Speicher brauchen Analytische Arbeitsabläufe in Python/R oder serverlosen Umgebungen
Beispiel für einen Abfragekontext SELECT * FROM users WHERE id=1; Wähle Region, AVG(Betrag) aus Verkäufe, gruppiert nach Region;

Was ist SQLite?

SQLite ist eine der am häufigsten eingesetzten Datenbanken weltweit. SQLite kam im Jahr 2000 raus und wurde als leichtes, serverlose SQL-Datenbank-Engine.

Hier sind ein paar der wichtigsten Features:

  • Eigenständig und ohne Server
  • Einrichtung ohne Konfiguration
  • Vollständig ACID-konform
  • Zeilenorientierte Speicherung

Wegen seiner schlanken Architektur kann es in folgenden Fällen eingesetzt werden:

  • Mobile Apps (Android, iOS)
  • Desktop-Software
  • Eingebettete Systeme wie IoT-Geräte

Die größte Stärke von SQLite ist, dass es einfach und zuverlässig ist. Entwickler können eine einzelne dateibasierte Datenbank mit ihrer Anwendung ausliefern, ohne sich um externe Abhängigkeiten kümmern zu müssen.

Was ist DuckDB?

DuckDB wird oft als SQLite für Analysen bezeichnet. DuckDB wurde 2019 eingeführt und am CWI entwickelt. Das Hauptziel von DuckDB war, eine In-Process-OLAP-Datenbanklösung zu haben. OLAP-Datenbanklösung.

Hier sind ein paar der wichtigsten Features:

  • Spaltenorientiertes Speicherformat
  • Optimiert für OLAP-Workloads
  • Vektorisierte Abfrageausführung
  • Eingebettetes Design während des Prozesses
  • Direkte Unterstützung für Dateiformate wie Parquet und Arrow

Ein paar typische Anwendungsfälle sind:

  • Interaktive Analysen
  • Data-Science-Workflows (Python, R, Jupyter)
  • Leichte ETL-Pipelines

Der wichtigste Punkt bei der Verwendung von DuckDB ist, dass es die Leistungsfähigkeit analytischer Datenbanken (wie Snowflake oder BigQuery) in einem eingebetteten Paket bietet.

DuckDB vs SQLite: Wichtige Unterschiede und Gemeinsamkeiten

1. Installation und Abhängigkeiten

SQLite

SQLite ist bekannt dafür, dass es keine Abhängigkeiten hat. Es wird zu einer einzigen C-Bibliothek zusammengestellt, die in so ziemlich jede Anwendung eingebaut werden kann.

Die Installation ist echt einfach und du kannst das Programm einfach von der SQLite-Website runterladen.

Die Portabilität ist eine der größten Stärken: Es läuft auf Windows, macOS, Linux, iOS und Android fast ohne zusätzlichen Aufwand gleich.

DuckDB

DuckDB ist auch einfach zu installieren, wird aber als separate Binärdateien oder Python-/R-Pakete und nicht überall vorinstalliert.

Es gibt ein paar weitere Abhängigkeiten, vor allem wenn man Integrationen mit Apache Arrow, Parquet oder Pandas.

Der Platzbedarf ist immer noch gering, aber im Vergleich zu SQLite braucht DuckDB ein bisschen mehr Einrichtung, wenn du erweiterte Funktionen wie Cloud-Speicher-Konnektoren oder die Integration von Data-Science-Tools haben willst.

2. Speicherformate und Architektur

SQLite 

Speichert Daten in einem zeilenbasierten Format, das für OLTP (Online Transaction Processing) Aufgaben wie Einfügen, Aktualisieren und Löschen.

Das Abrufen einer ganzen Zeile geht schnell, aber analytische Abfragen, die nur ein paar Spalten über Millionen von Zeilen scannen, können langsam werden, weil unnötige Daten gelesen werden.

DuckDB

DuckDB nutzt eine Spaltenspeicher-Engine, die extra für OLAP (Online Analytical Processing) entwickelt wurde.

Das spaltenorientierte Format bedeutet, dass Abfragen, die große Datensätze zusammenfassen (z. B. AVG(sales) oder COUNT(*)), viel schneller sind, weil nur die relevanten Spalten in den Speicher geladen werden.

Ermöglicht außerdem eine bessere Komprimierung und vektorisierte Ausführung für mehr Geschwindigkeit.

Beispiel: Eine Abfrage wie „ SELECT * FROM sales WHERE customer_id=123 “ läuft schneller auf SQLite, während SELECT AVG(amount) FROM sales GROUP BY region “ auf DuckDB viel schneller geht.

3. Transaktionsbezogene vs. analytische Arbeitslasten

Die beiden Datenbanken haben auch unterschiedliche Arbeitslasten:

  • OLTP (Transactional): Kurze, häufige Vorgänge (z. B. Banking-Apps, Benutzerprofile, Kassensysteme). Die wichtigsten Sachen sind niedrige Latenz, Datenintegrität und gleichzeitiger Zugriff.
  • OLAP (Analytisch): Komplexe Abfragen über große Datensätze (z. B. Dashboards, BI-Tools, Ad-hoc-Datenanalysen). Die wichtigsten Sachen sind Durchsatz, Scan-Leistung und wie schnell die Daten zusammengefasst werden.

SQLite

SQLite ist für OLTP (Einfügen, Aktualisieren, Löschen, Punktabfragen) optimiert.

Zum Beispiel:

  • Mobile Apps, die Offline-Daten speichern.
  • IoT-Geräte, die Benutzerinteraktionen aufzeichnen.
  • Lokale Caches in Desktop-Anwendungen.

DuckDB

DuckDB ist für OLAP (Aggregationen, Verknüpfungen, Scans) optimiert.

Zum Beispiel:

  • Datenwissenschaftler, die Aggregationen auf Parquet-/CSV-Dateien machen.
  • Interaktive BI-Dashboards , wo Abfragen Millionen von Zeilen zusammenfassen.
  • ETL/ELT-Pipelines die leichte In-Memory-Transformationen brauchen.

4. SQL-Unterstützung und Syntax

Als Nächstes schauen wir uns mal ihre SQL-Syntax an. Beide setzen einen großen Teil des SQL-Standards mit Erweiterungen um; keiner ist komplett ANSI-konform.

SQLite

  • Unterstützt einen Großteil des SQL-Standards, lässt aber fortgeschrittene analytische Konstrukte weg.
  • Super für CRUD-Operationen und einfachere Verknüpfungen.
  • Unterstützt Fensterfunktionen und CTEs, aber es fehlen fortgeschrittenere Analysefunktionen wie GROUPING SETS und einige Aggregat-Erweiterungen.

So sieht die Syntax aus:

CREATE TABLE sales (
    id INTEGER PRIMARY KEY,
    product TEXT,
    amount REAL,
    sale_date TEXT
);

DuckDB

  • Viel näher an der ANSI-SQL-Konformität, mit starker Unterstützung für Fensterfunktionen, CTEs, Aggregationen und Mengenoperationen.
  • Entwickelt, um sich wie ein leichtes PostgreSQL für Analysen anzufühlen.
  • Durch die Integration mit Arrow und Pandas kannst du SQL direkt auf externen Datensätzen ausführen, ohne sie vorher importieren zu müssen.

Hier ist ein ähnliches Beispiel dafür, wie die Syntax für DuckDB aussieht:

CREATE TABLE sales (
    id INTEGER,
    product VARCHAR,
    amount DOUBLE,
    sale_date DATE
);

SQLite vs DuckDB: Grundlegende Architektur und Designphilosophie

Was die grundlegende Architektur angeht, sind SQLite und DuckDB beides eingebettete In-Process-Datenbanken. Aber ihre Designideen sind unterschiedlich. 

SQLite legt Wert auf einfache Transaktionen und Zuverlässigkeit, während DuckDB für analytische Aufgaben und moderne Datenwissenschaftsintegration optimiert ist.

1. Speicherarchitektur

Erstens unterscheiden sich die beiden Datenbanken in ihrer Speicherarchitektur.

SQLite

SQLite ist zeilenbasiert, was super für den transaktionalen Zugriff ist. Das heißt, ganze Zeilen werden zusammen auf der Festplatte gespeichert.

Dieses Design ist super für Transaktions-Workloads (OLTP), weil man zum Einfügen, Aktualisieren oder Abrufen eines einzelnen Datensatzes normalerweise nur auf eine Zeile zugreifen muss.

Apps, die schnell und immer auf einzelne Datensätze zugreifen müssen, wie zum Beispiel Benutzerprofile oder Bestelldetails, laufen in diesem Modell super.

DuckDB

DuckDB nutzt ein spaltenorientiertes Format, das dafür gemacht ist, Milliarden von Zeilen schnell zu scannen. Ein spaltenorientiertes Format heißt, dass Werte derselben Spalte auf der Festplatte und im Speicher zusammen gruppiert werden.

Die spaltenorientierte Speicherung macht super effiziente analytische Abfragen (OLAP) möglich, weil Aggregationen, Filter und Scans oft nur auf einen Teil der Spalten zugreifen müssen.

Komprimierungstechniken funktionieren besser über Spalten hinweg, sparen Speicherplatz und verbessern die Scan-Leistung.

2. Methoden zur Abfrageverarbeitung

Als Nächstes müssen wir uns anschauen, wie jeder von ihnen Abfragen verarbeitet.

Im Allgemeinen ist das Modell von SQLite auf Einfachheit und Transaktionskorrektheit ausgelegt, während die vektorisierte Engine von DuckDB auf Durchsatz und analytische Leistung optimiert ist.

SQLite

SQLite nutzt ein klassisches iteratorbasiertes Modell, bei dem eine Zeile nach der anderen durch die Abfrage-Pipeline geschickt wird.

Dieser Ansatz, bei dem eine Zeile nach der anderen abgearbeitet wird, ist leicht und passt gut zu Transaktions-Workloads, wo Abfragen oft kleine Datensätze und häufige Einfügungen oder Aktualisierungen beinhalten.

Allerdings gibt's Performance-Probleme, wenn Abfragen große Datensätze durchsuchen müssen, weil die zeilenweise Auswertung zusätzlichen Aufwand bedeutet.

DuckDB

DuckDB nutzt vektorisierte Abfrageausführung und verarbeitet mehrere Zeilen (Vektoren) gleichzeitig, statt eine nach der anderen.

Dieser Ansatz reduziert den CPU-Overhead, nutzt moderne CPU-Caches besser aus und ermöglicht SIMD-Parallelität (Single Instruction, Multiple Data).

Die vektorisierte Ausführung ist besonders praktisch für Analysen: Sachen wie Aggregationen, Verknüpfungen und Filter laufen bei großen Datenmengen echt schneller.

In DuckDB wird die folgende Abfrage durch die spaltenorientierte Speicherung und die vektorisierte Verarbeitung beschleunigt, was sie deutlich schneller macht.

SELECT region, AVG(amount)
FROM sales
GROUP BY region;

3. In-Process-Datenbankarchitektur

Zu guter Letzt sind SQLite und DuckDB eingebettete Datenbanken, was bedeutet, dass sie innerhalb des Prozesses der Host-Anwendung laufen und nicht als separater Datenbankserver.

Diese Architektur macht Schluss mit Netzwerkverzögerungen, macht die Bereitstellung einfacher und reduziert den Aufwand für die Verwaltung externer Dienste.

Das macht sie zu:

  • Einfach zu verteilen
  • Einfach einzusetzen
  • Geringe Latenz (kein Client-Server-Overhead)

SQLite 

SQLite hat die Idee einer „serverlosen“ Datenbank ins Leben gerufen. Das heißt, deine Apps sind direkt mit der Bibliothek verbunden und alle Abfragen laufen direkt in der App ab.

DuckDB 

DuckDB hat ein ähnliches In-Process-Design, nutzt es aber für analytische Sachen.

Um den Aufwand für das Hochfahren externer Analyse-Engines zu vermeiden, nutzt DuckDB Data-Science-Umgebungen (Python, R oder sogar Jupyter-Notebooks), indem es Abfragen darin ausführt.

DuckDB vs. SQLite – Leistungsanalyse und Benchmarking

Die Leistung ist einer der wichtigsten Unterschiede zwischen DuckDB und SQLite. Beide sind zwar eingebettete Datenbanken, aber wie sie sich bei unterschiedlichen Arbeitslasten verhalten, hängt davon ab, was bei ihrer Entwicklung im Vordergrund stand. 

Im Allgemeinen ist SQLite super für Transaktionsanwendungen, während DuckDB in analytischen Sachen gut abschneidet.

1. Analytische Abfrageleistung

DuckDB:

  • Besser als SQLite bei Aggregationen, Verknüpfungen und Gruppierungen.
  • Kann Parquet-/Arrow-Dateien direkt abfragen.
  • DuckDB ist für die Ausführung analytischer Abfragen gemacht und ist bei der Verarbeitung großer Datensätze meistens besser als SQLite.

Schauen wir mal, wie man das mit einer Aggregationsabfrage testen kann.

Angenommen, wir haben einen Datensatz mit Verkaufsdaten (sales.csv) mit 10 Millionen Zeilen, die folgende Werte enthalten: order_id, customer_id, amount und date.

SQLite (Python):

Um diese Abfrage in SQLite mit Python auszuführen, müssen wir die CSV-Datei in ein DataFrame laden, sie in eine Datenbank mit einer „ SQLite3 “-Verbindung einlesen und unsere SQL-Abfrage darin ausführen.

Hier ist ein Beispiel für einen Code:

import sqlite3
import pandas as pd

# Load CSV into SQLite
df = pd.read_csv("sales.csv")
conn = sqlite3.connect("sales.db")
df.to_sql("sales", conn, if_exists="replace", index=False)

# Run a GROUP BY query directly on the imported table
cursor = conn.execute("""
    SELECT customer_id, SUM(amount) AS total_spent
    FROM sales
    GROUP BY customer_id
    ORDER BY total_spent DESC
    LIMIT 5
""")
print(cursor.fetchall())

DuckDB (Python):

Um eine ähnliche Abfrage mit DuckDB in Python zu machen, braucht man weniger Schritte. Ein Datenrahmen ist nicht nötig.

Hier ist ein Beispiel für einen Code:

import duckdb

con = duckdb.connect()
# Run a GROUP BY query directly on the CSV file
result = con.execute(""" SELECT customer_id, SUM(amount) AS total_spent FROM read_csv_auto('sales.csv') GROUP BY customer_id ORDER BY total_spent DESC LIMIT 5 """).fetchdf()
print(result)

2. Leistung bei Transaktions-Workloads

Was die Transaktionsauslastung angeht, hat jede Datenbank ihre eigenen Anwendungsfälle.

SQLite ist super für transaktionsintensive Punktabfragen. Es macht häufig vorkommende INSERT-, UPDATE- und DELETE-Operationen mit echt geringem Aufwand und ist damit super für eingebettete Transaktionssysteme.

SQLite macht Massen-Einfügungen mit Transaktionen richtig gut und läuft super, wenn man oft kleine Aktualisierungen machen muss.

DuckDB konzentriert sich dagegen mehr auf analytische Abfragen nach der Datenerfassung als auf hochfrequente Transaktionsaktualisierungen.

3. Skalierbarkeit und Ressourcennutzung

SQLite

SQLite ist leicht und wird oft für kleine bis mittlere Datensätze benutzt. Eine einzelne Abfrage läuft auf einem Thread und SQLite nutzt ein Single-Writer-Modell mit gleichzeitigen Lesevorgängen; es parallelisiert keine einzelnen SELECT-Anfragen, was den analytischen Durchsatz einschränken kann.

DuckDB

DuckDB kann mit Multi-Core-Parallelität und Abfragen, die größer als der Arbeitsspeicher sind, umgehen. Es skaliert durch parallele Ausführung und kann bei Bedarf auf die Festplatte ausgelagert werden, was Out-of-Core-Analysen ermöglicht.

Dadurch kann es Datensätze analysieren, die den Systemspeicher weit übersteigen, und trotzdem eine Leistung beibehalten, die der Ausführung im Arbeitsspeicher nahekommt.

4. Dateiformat und I/O-Leistung

SQLite

SQLite speichert Daten in seinem eigenen zeilenbasierten Format, das zwar portabel und stabil ist, aber nicht direkt mit modernen Analyseformaten zusammenarbeitet. Daten müssen oft erst in SQLite importiert werden, bevor Abfragen laufen können, was zusätzlichen I/O-Overhead verursacht.

DuckDB

DuckDB unterstützt von Haus aus mehrere Dateiformate, wie Parquet, Arrow und CSV, sodass Daten direkt abgefragt werden können, ohne dass sie erst umgewandelt werden müssen (z. B. SELECT … FROM 'file.parquet').

Das spart ETL-Aufwand und macht die Analyse schneller, weil nur die benötigten Daten aus Spaltenformaten wie Parquet gelesen werden.

Datenaufnahme und Interoperabilität in DuckDB vs. SQLite

Datenbanken werden oft benutzt, um viele Daten zu speichern. Als Nächstes schauen wir uns an, wie sie in Sachen Datenaufnahme und Interoperabilität abschneiden.

1. Unterstützte Dateiformate und Import

DuckDB

DuckDB kann Parquet, Arrow und CSV direkt einlesen. Es kann SQL-Abfragen direkt auf Parquet ausführen, ohne es in eine Datenbankdatei zu importieren.

import duckdb

con = duckdb.connect()
result = con.execute("""
    SELECT customer_id, SUM(amount) AS total_spent
    FROM 'sales.parquet'
    GROUP BY customer_id
    ORDER BY total_spent DESC
    LIMIT 5
""").fetchdf()

print(result)

SQLite

SQLite braucht externe Daten in sein Speicherformat zu importieren, bevor Abfragen gemacht werden können.

import sqlite3
import pandas as pd

# Load CSV into pandas first
df = pd.read_csv("sales.csv")

# Store into SQLite
conn = sqlite3.connect("sales.db")
df.to_sql("sales", conn, if_exists="replace", index=False)

# Query the imported table
cursor = conn.execute("""
    SELECT customer_id, SUM(amount) AS total_spent
    FROM sales
    GROUP BY customer_id
    ORDER BY total_spent DESC
    LIMIT 5
""")

print(cursor.fetchall())

2. Integration mit Data-Science-Tools

DuckDB

DuckDB ist eng mit Pandas, R und Jupyter verbunden und lässt sich direkt in Pandas DataFrames integrieren, sodass du sie wie SQL-Tabellen behandeln kannst:

import duckdb
import pandas as pd

# Example pandas DataFrame
df = pd.DataFrame({
    "customer_id": [1, 2, 1, 3],
    "amount": [100, 200, 150, 300]
})

# Query DataFrame directly with DuckDB
result = duckdb.query("""
    SELECT customer_id, AVG(amount) as avg_spent
    FROM df
    GROUP BY customer_id
""").to_df()

print(result)

SQLite

SQLite läuft mit vielen Programmiersprachen, ist aber nicht so sehr auf Datenwissenschaft ausgerichtet.

Zum Beispiel kann SQLite auch mit Pandas zusammenarbeiten, aber meistens braucht man dafür mehr Boilerplate-Code.

import sqlite3
import pandas as pd

conn = sqlite3.connect(":memory:")
df = pd.DataFrame({
    "customer_id": [1, 2, 1, 3],
    "amount": [100, 200, 150, 300]
})

df.to_sql("sales", conn, index=False, if_exists="replace")

# Query back into pandas
query = "SELECT customer_id, AVG(amount) as avg_spent FROM sales GROUP BY customer_id"
result = pd.read_sql_query(query, conn)

print(result)

3. Sprachbindungen und APIs

SQLite

SQLite gibt's schon seit 2000, also sind seine Bindungen echt ausgereift. Weil es nur eine kleine C-Bibliothek ist, haben die meisten Sprachen offizielle oder Community-Unterstützung.

Einige Beispiele sind: C, Python (sqlite3), Java, PHP und mehr.

DuckDB

DuckDB ist viel neuer, wurde aber mit Blick auf Datenwissenschaft und Analyse-Workflows entwickelt. Es hat weniger Bindungen, ist aber super für die Datenwissenschaft geeignet.

Einige Beispiele sind: Python-, R-, C++- und JavaScript-Bindungen.

Anwendungsfälle und Anwendungsbereiche

Obwohl sowohl SQLite als auch DuckDB leichte, eingebettete Datenbanken sind, haben sie ganz unterschiedliche Aufgaben. 

SQLite ist super für Transaktionen und Anwendungen, während DuckDB eher für Analysen in der Datenwissenschaft und Business Intelligence gemacht ist. In manchen Fällen können sie sich sogar gegenseitig ergänzen.

Schauen wir uns mal ein paar konkrete Beispiele an:

1. SQLite-Anwendungsszenarien

SQLite ist super leicht, was es perfekt macht für:

  • Speicherplatz für mobile Apps: SQLite ist die Standarddatenbank für Android- und iOS-Apps und bietet dauerhaften lokalen Speicherplatz, ohne dass ein Server-Backend nötig ist.
  • IoT-Geräte: Leichte IoT-Geräte nutzen oft SQLite, weil es wenig Speicherplatz braucht und man es nicht extra einrichten muss.
  • Browser-Caching: SQLite wird oft als Cache-Schicht in verteilten Systemen oder als Zwischenspeicher beim Datenaustausch zwischen Systemen genutzt.

2. Analytische Anwendungen von DuckDB

DuckDB ist eng mit analytischen Abläufen wie ETL-Pipelines verbunden. Hier ist ein Beispiel, wie man das in Python machen kann.

Die DuckDB-Befehlszeilenschnittstelle benutzen:

-- Connect / create DB
ATTACH 'warehouse.duckdb' AS wh; USE wh;

-- EXTRACT: read a CSV
CREATE OR REPLACE VIEW v_orders AS
SELECT * FROM read_csv_auto('data/orders.csv');  -- order_id, customer_id, order_ts, status, amount

-- TRANSFORM: clean types + derive metrics
WITH cleaned AS (
  SELECT
    CAST(order_id AS BIGINT)              AS order_id,
    CAST(customer_id AS BIGINT)           AS customer_id,
    TRY_CAST(order_ts AS TIMESTAMP)       AS order_ts,
    COALESCE(NULLIF(status,''),'unknown') AS status,
    TRY_CAST(amount AS DOUBLE)            AS amount
  FROM v_orders
),
agg AS (
  SELECT DATE_TRUNC('day', order_ts) AS order_date,
         SUM(amount)                 AS daily_gmv,
         COUNT(*)                    AS orders
  FROM cleaned
  GROUP BY 1
)
-- LOAD: upsert curated tables + export parquet
CREATE TABLE IF NOT EXISTS fact_orders AS SELECT * FROM cleaned WHERE 1=0;
MERGE INTO fact_orders t USING cleaned s
ON t.order_id = s.order_id
WHEN MATCHED THEN UPDATE SET
  customer_id=s.customer_id, order_ts=s.order_ts, status=s.status, amount=s.amount
WHEN NOT MATCHED THEN INSERT VALUES
  (s.order_id, s.customer_id, s.order_ts, s.status, s.amount);

COPY agg TO 'warehouse/daily_gmv' (FORMAT PARQUET, PARTITION_BY (order_date), OVERWRITE_OR_IGNORE 1);

Jetzt startest du die Datei im Terminal:

duckdb -c ".read etl.sql"

Alternativ kannst du DuckDB auch in Python für einen optimierten Datenanalyse-Workflow nutzen.

import duckdb, pathlib
db = pathlib.Path("warehouse.duckdb")
con = duckdb.connect(str(db))

# EXTRACT
con.execute("""
CREATE OR REPLACE VIEW v_orders AS
SELECT * FROM read_csv_auto('data/orders.csv')
""")

# TRANSFORM
con.execute("""
CREATE OR REPLACE VIEW v_clean AS
SELECT CAST(order_id AS BIGINT) order_id,
       CAST(customer_id AS BIGINT) customer_id,
       TRY_CAST(order_ts AS TIMESTAMP) order_ts,
       COALESCE(NULLIF(status,''),'unknown') status,
       TRY_CAST(amount AS DOUBLE) amount
FROM v_orders
""")

# LOAD (table + parquet export)
con.execute("CREATE TABLE IF NOT EXISTS fact_orders AS SELECT * FROM v_clean WHERE 1=0")
con.execute("""
MERGE INTO fact_orders t USING v_clean s
ON t.order_id = s.order_id
WHEN MATCHED THEN UPDATE SET customer_id=s.customer_id, order_ts=s.order_ts, status=s.status, amount=s.amount
WHEN NOT MATCHED THEN INSERT VALUES (s.order_id, s.customer_id, s.order_ts, s.status, s.amount)
""")
con.execute("""
COPY (SELECT DATE_TRUNC('day', order_ts) AS order_date, SUM(amount) AS daily_gmv FROM fact_orders GROUP BY 1)
TO 'warehouse/daily_gmv' (FORMAT PARQUET, PARTITION_BY (order_date), OVERWRITE_OR_IGNORE 1)
""")

3. Hybride und ergänzende Szenarien

Analysiere SQLite-Daten in DuckDB:

DuckDB kann Daten direkt in einer SQLite-Datenbankdatei abfragen:

import duckdb

# Query a SQLite database via the sqlite_scanner extension
con = duckdb.connect()
con.install_extension("sqlite_scanner")
con.load_extension("sqlite_scanner")

result = con.execute("""
    SELECT customer_id, COUNT(*) AS orders
    FROM sqlite_scan('app_cache.db', 'orders')
    GROUP BY customer_id
    ORDER BY orders DESC
""").fetchdf()

print(result)

Leistung optimieren und Best Practices

Sowohl SQLite als auch DuckDB sind von Grund auf effizient, aber ihre Leistung kann stark variieren, je nachdem, wie Daten eingegeben, abgefragt und verwaltet werden.

1. Massen-Einfügungen und effiziente Datenverarbeitung

SQLite

Bei großen Datenmengen solltest du immer Transaktionen verwenden. Wenn du Zeilen einzeln ohne Transaktion einfügst, muss SQLite jede Zeile einzeln speichern, was die Leistung stark verlangsamt.

import sqlite3

conn = sqlite3.connect("perf.db")
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS logs (id INTEGER, message TEXT)")

# Bulk insert with a single transaction
data = [(i, f"event {i}") for i in range(100000)]
cur.execute("BEGIN TRANSACTION;")
cur.executemany("INSERT INTO logs VALUES (?, ?)", data)
conn.commit()

Wenn du deine Daten wie im Beispiel oben gruppierst, wird die Leistung echt verbessert.

DuckDB

DuckDB kann große Datensätze super effizient verarbeiten, vor allem wenn sie aus externen Dateien kommen. Nutze „ COPY “-Befehle oder direkte Abfragen von Parquet/CSV für schnellere Pipelines.

import duckdb
con = duckdb.connect()
# Bulk load CSV into DuckDB
con.execute(""" CREATE OR REPLACE TABLE logs AS SELECT * FROM read_csv_auto('transactions.csv') """)

2. Techniken zur Abfrageoptimierung

SQLite

Um deine Abfragen besser zu optimieren, solltest du Indizes für Suchvorgänge nutzen.

CREATE INDEX idx_customer_id ON orders(customer_id);

Ich würde empfehlen, EXPLAIN QUERY PLAN zu nutzen, um Ausführungspfade zu analysieren und fehlende Indizes zu finden.

Generell solltest du versuchen, Abfragen einfach zu halten und unnötige Verknüpfungen in Umgebungen mit begrenzten Ressourcen zu vermeiden.

DuckDB

Für DuckDB kannst du Spaltenbeschneidung und Prädikat-Pushdown nutzen.

  • Spaltenbeschneiden: DuckDB liest nur die Spalten, die deine Abfrage wirklich braucht. Das sorgt für weniger I/O und schnellere Scans – vor allem bei breiten Tabellen oder Parquet-Dateien.
  • Prädikat-Pushdown: DuckDB schiebt deine WHERE-Filter runter in den Tabelle-/Dateiscan, damit es Zeilengruppen/Seiten/Dateien überspringen kann, die nicht passen. Dadurch werden viel weniger Bytes gelesen, indem Datei-/Partitionsstatistiken (z. B. Parquet min/max) genutzt werden.

Beispiel für das Kürzen von Spalten:

-- Only reads the 'user_id' and 'amount' columns; other columns aren’t touched
SELECT user_id, SUM(amount)
FROM read_parquet('events/*.parquet')
GROUP BY user_id;

Beispiel für Prädikat-Pushdown (Parquet):

-- Skips row groups/pages whose min/max(order_ts) are entirely outside this range
SELECT *
FROM read_parquet('events/dt=*/events.parquet')
WHERE order_ts >= TIMESTAMP '2025-09-01'
  AND order_ts <  TIMESTAMP '2025-10-01';

3. Wartung und Betrieb

  • SQLite: Regelmäßige „ VACUUM “-Operationen, um Speicherplatz freizugeben. Für eingebettete Anwendungen solltest du auf ausreichend Festplatten-E/A achten und den WAL-Modus nutzen, um die Haltbarkeit und den gleichzeitigen Zugriff zu verbessern.
  • DuckDB: Optimiert für Analysen; kaum Anpassungen nötig. Organisiere große Datensätze in partitionierte Parquet-Dateien, um die Vorteile von Partition Pruning zu nutzen.Führe regelmäßig Benchmarks für Abfragen anhand von Beispiel-Workloads durch, um die Parallelitätseinstellungen (über PRAGMA-Threads) zu optimieren.

Entwicklung, Integration und Ökosystem

Datenbanken müssen gut integriert sein, damit man leicht auf die Daten zugreifen kann. Jetzt schauen wir uns an, wie jede Datenbank mit anderen Systemen zusammenarbeitet.

1. Unterstützung von Programmiersprachen und APIs

  • SQLite: Breite Sprachunterstützung. Bietet eine der umfangreichsten Auswahlen an Sprachbindungen in der Datenbankwelt. Es gibt offizielle und von der Community gepflegte Treiber für Python, Java, C#, C/C++, PHP, Go, Ruby, Rust und mehr als 30 weitere Sprachen.
  • DuckDB: Starke Datenwissenschaft-Integrationen. Konzentriert sich auf datenwissenschaftliche Bindungen: offizielle Unterstützung für Python, R und C/C++.

2. Integration von Datenwissenschaft und Analytik

DuckDB: Arbeitet direkt mit Pandas-DataFrames.

Beispiel:

import duckdb 
import pandas as pd

df = pd.DataFrame({"x": [1,2,3], "y": [10,20,30]})
duckdb.query("SELECT AVG(y) FROM df").show()

DuckDB unterstützt auch benutzerdefinierte Funktionen (UDFs) in SQL und Python, was fortgeschrittene Analysen und individuelle Transformationen ermöglicht.

Beispiel (Python-UDF in DuckDB):

import duckdb
import math

con = duckdb.connect()

# Register a Python function as UDF
con.create_function("sqrt_plus", lambda x: math.sqrt(x) + 1)

result = con.execute("SELECT sqrt_plus(16)").fetchall()
print(result)  # [(5.0,)]

3. Cloud- und Infrastruktur-Integration

SQLite

SQLite ist eine lokale Datenbank, die vor allem für den lokalen, eingebetteten Speicher gedacht ist.

Es wird in Cloud-nativen Anwendungen als leichte Persistenzschicht oder Cache genutzt, meistens in Containern. Auch wenn es keine direkten Cloud-Speicher-Anbindungen gibt, sind SQLite-Datenbanken portabel und lassen sich leicht zwischen verschiedenen Umgebungen übertragen.

DuckDB

DuckDB wird immer öfter in der Cloud eingesetzt (Abfragen von S3-Parquet-Dateien), weil es für moderne Datenarchitekturen optimiert ist.

Es bietet auch native Unterstützung für die Abfrage von Cloud-Speicherformaten wie Parquet- und Arrow-Dateien auf AWS S3, Azure Blob Storageoder Google Cloud Storage.

DuckDB passt super in Serverless-Analytics-Szenarien, wo Daten in Objektspeichern abgelegt und bei Bedarf abgefragt werden, ohne dass ein schwerfälliges Warehouse nötig ist.

Einschränkungen und Kompromisse

Trotz ihrer Stärken haben sowohl DuckDB als auch SQLite gewisse Einschränkungen, die mit ihrer Designphilosophie zusammenhängen. 

  • Einschränkungen bei Parallelität und Skalierbarkeit:
    • SQLite: Begrenzte Schreibkonkurrenz.
    • DuckDB: Einzelprozess-Parallelitätsmodell.
  • Einschränkungen beim Speicher- und Ressourcenmanagement:
    • SQLite: Leicht, aber nicht für richtig große Datensätze geeignet.
    • DuckDB: Kann auf die Festplatte kopiert werden, ist aber nicht für die Transaktionsbeständigkeit in großem Maßstab ausgelegt.
  • Funktions- und Leistungslücken:
    • SQLite: Eingeschränkte Analysefunktionen.
    • DuckDB: Eingeschränkte Transaktionsrobustheit.
  • Leistungskompromisse und Einschränkungen:
    • SQLite: Schnell für Transaktionen, langsam für Analysen.
    • DuckDB: Schnell für Analysen, langsamer für kleine Schreibvorgänge.

SQLite vs. DuckDB – Abschließende Gedanken

DuckDB und SQLite haben beide wichtige, aber unterschiedliche Aufgaben:

  • Entscheide dich für SQLite, wenn du eine einfache, schlanke Transaktionsdatenbank für Apps und eingebettete Systeme brauchst.
  • Entscheide dich für DuckDB, wenn du leistungsstarke Analysen direkt in deinen Python/R-Workflows brauchst.

In vielen Fällen ergänzen sie sich gegenseitig: SQLite für die Speicherung und Transaktionen, DuckDB für analytische Abfragen auf diesen Daten. Die richtige Wahl hängt davon ab, ob du mehr OLTP (Transaktionen) oder OLAP (Analysen) machst.

Willst du mehr über Datenbanken wie DuckDB und SQLite erfahren? Schau dir unser Einsteigerhandbuch zum SQLite-Tutorial und unsere Einführung in DuckDB SQL Code-Along-Tutorial an.

DuckDB vs. SQLite – Häufig gestellte Fragen

Wie geht DuckDB mit Datensätzen um, die größer als der Arbeitsspeicher sind?

DuckDB nutzt eine vektorisierte Ausführungs-Engine und kann Zwischenergebnisse auf die Festplatte auslagern, wenn Abfragen den verfügbaren Arbeitsspeicher übersteigen. Dadurch kann es viel größere Datensätze als der Arbeitsspeicher verarbeiten und trotzdem eine gute Leistung bringen, auch wenn die Geschwindigkeit stark von der Festplatten-E/A abhängt.

Was sind die wichtigsten Leistungsunterschiede zwischen DuckDB und SQLite?

SQLite ist für Transaktions-Workloads (OLTP) optimiert und eignet sich besonders gut für kleine Einfügungen, Aktualisierungen und Einzelzeilen-Lookups. DuckDB ist dagegen für analytische Aufgaben (OLAP) optimiert und kann dank seines spaltenorientierten Designs und der parallelen Ausführung Aggregationen, Verknüpfungen und Scans in großen Datensätzen schneller erledigen.

Kann DuckDB für Echtzeitanalysen genutzt werden?

DuckDB eignet sich am besten für Batch- oder interaktive Analysen, nicht für kontinuierliche Echtzeit-Streams. Es kann neue Daten schnell analysieren, wenn sie aus Dateien eingelesen oder abgerufen werden, aber es fehlt ihm die integrierte Streaming-Funktion und die Fähigkeit zum Einlesen hoher Frequenzen, die man in speziellen Echtzeitsystemen findet.

Wie verbessert die spaltenorientierte Speicherung von DuckDB die Abfrageleistung?

Durch die spaltenorientierte Speicherung kann DuckDB nur die Spalten lesen, die für eine Abfrage gebraucht werden, was den I/O-Overhead reduziert. Zusammen mit Komprimierung und vektorisierter Ausführung verbessert das die Cache-Effizienz und macht Vorgänge wie Aggregationen und Filterungen in großen Datensätzen schneller.

Was sind die Einschränkungen bei der Verwendung von DuckDB für Transaktions-Workloads mit hoher Parallelität?

DuckDB ist nicht für Transaktionssysteme mit mehreren Benutzern gedacht. Es unterstützt ACID-Transaktionen, aber sein Parallelitätsmodell ist eingeschränkt, sodass es für Umgebungen mit vielen gleichzeitigen Schreibzugriffen oder hochfrequenten Aktualisierungen nicht geeignet ist. SQLite oder eine serverbasierte Datenbank sind für solche Fälle besser geeignet.


Austin Chia's photo
Author
Austin Chia
LinkedIn

Ich bin Austin, ein Blogger und Tech-Autor mit jahrelanger Erfahrung als Datenwissenschaftler und Datenanalyst im Gesundheitswesen. Ich habe meine Reise in die Welt der Technik mit einem Hintergrund in Biologie begonnen und helfe jetzt anderen mit meinem Technik-Blog, den gleichen Weg einzuschlagen. Meine Leidenschaft für Technologie hat dazu geführt, dass ich für Dutzende von SaaS-Unternehmen schreibe, um andere zu inspirieren und meine Erfahrungen zu teilen.

Themen

Die besten DataCamp-Kurse

Kurs

Introduction to Databases in Python

4 Std.
99.5K
In this course, you'll learn the basics of relational databases and how to interact with them.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Lernprogramm

Python Switch Case Statement: Ein Leitfaden für Anfänger

Erforsche Pythons match-case: eine Anleitung zu seiner Syntax, Anwendungen in Data Science und ML sowie eine vergleichende Analyse mit dem traditionellen switch-case.
Matt Crabtree's photo

Matt Crabtree

Lernprogramm

Python-Anweisungen IF, ELIF und ELSE

In diesem Tutorial lernst du ausschließlich Python if else-Anweisungen kennen.
Sejal Jaiswal's photo

Sejal Jaiswal

Lernprogramm

Python JSON-Daten: Ein Leitfaden mit Beispielen

Lerne, wie man mit JSON in Python arbeitet, einschließlich Serialisierung, Deserialisierung, Formatierung, Leistungsoptimierung, Umgang mit APIs und Verständnis der Einschränkungen und Alternativen von JSON.
Moez Ali's photo

Moez Ali

Lernprogramm

Wie sortiert man ein Wörterbuch in Python nach Werten?

Lerne effiziente Methoden, um ein Wörterbuch in Python nach Werten zu sortieren. Lerne, wie du Sachen aufsteigend oder absteigend sortieren kannst, und hol dir ein paar coole Tipps zum Sortieren von Schlüsseln.
Neetika Khandelwal's photo

Neetika Khandelwal

Lernprogramm

Python-Lambda-Funktionen: Ein Leitfaden für Anfänger

Lerne mehr über Python-Lambda-Funktionen, wozu sie gut sind und wann man sie benutzt. Enthält praktische Beispiele und bewährte Methoden für eine effektive Umsetzung.
Mark Pedigo's photo

Mark Pedigo

Lernprogramm

Ein Leitfaden zu Python-Hashmaps

Finde heraus, was Hashmaps sind und wie sie in Python mit Hilfe von Wörterbüchern umgesetzt werden.
Javier Canales Luna's photo

Javier Canales Luna

Mehr anzeigenMehr anzeigen