Cours
Dans la gestion moderne des données, les bases de données embarquées légères jouent un rôle crucial dans le fonctionnement des applications, des flux de travail et des analyses. Deux systèmes fréquemment comparés sontDuckDB d' et SQLite.
Les deux sont des bases de données intégrées, mais elles ont des objectifs différents : SQLite est particulièrement performant pour les charges de travail transactionnelles, tandis que DuckDB est optimisé pour les requêtes analytiques.
Dans cet article comparatif, nous examinerons les différences entre ces deux bases de données.
En bref : DuckDB par rapport à SQLite
Voici un tableau comparatif présentant les similitudes et les différences entre DuckDB et SQLite. Pour plus de détails, veuillez consulter les explications fournies tout au long de cet article.
| Catégorie | SQLite | DuckDB |
|---|---|---|
| Année de sortie | 2000 | 2019 |
| Objectif principal | Base de données transactionnelle (OLTP) légère | Base de données analytique intégrée (OLAP) |
| Modèle de stockage | Basé sur les lignes | Colonnaire |
| Type de charge de travail | OLTP (insertion, mise à jour, suppression, recherche ponctuelle) | OLAP (agrégations, jointures, analyses) |
| Exécution de requêtes | Basé sur un itérateur (ligne par ligne) | Vectorisé (par lots) |
| Force de performance | Idéal pour les transactions de faible montant et fréquentes | Idéal pour les requêtes analytiques sur de grands ensembles de données |
| Modèle de concurrence | Un seul auteur, plusieurs lecteurs | Exécution parallèle des requêtes sur plusieurs cœurs de processeur |
| Gestion de la taille des données | Optimisé pour les ensembles de données de petite à moyenne taille | Gère des ensembles de données plus volumineux que la mémoire disponible (exécution hors mémoire) |
| Formats de fichiers pris en charge | Fichier SQLite propriétaire uniquement | Prise en charge native du format Parquet, Arrow et CSV |
| Accès aux données externes | Nécessite une importation avant la requête | Interroger les fichiers directement sans les importer |
| Intégrations | Large prise en charge des langages (C, Python, Java, PHP, etc.) | Intégration approfondie de la science des données (Python, R, pandas, Jupyter) |
| Intégration dans le cloud | Priorité au local, fonctionnalités cloud limitées | Intégration native de S3, Azure et GCS pour Parquet/Arrow |
| Transactions et ACID | Entièrement conforme à la norme ACID | ACID dans un processus unique, moins robuste pour les écritures simultanées |
| Configuration et dépendances | Bibliothèque C unique, sans configuration | Installation simple, mais avec des dépendances facultatives (Arrow, Pandas) |
| Fonctionnalités SQL | Axé sur CRUD ; prise en charge partielle du SQL analytique | Prise en charge étendue de la norme ANSI SQL avec des analyses avancées (CTE, fonctions de fenêtre) |
| Cas d'utilisation typiques | Applications mobiles, appareils IoT, caches locales | Science des données, tableaux de bord BI, pipelines ETL |
| Évolutivité | Limité à l'exécution à thread unique | Parallélisme multicœur et débordement sur disque pour les charges de travail importantes |
| Entretien | Minimal ; VACUUM occasionnel pour libérer de l'espace | Minimale ; gestion partitionnée de Parquet pour une efficacité accrue |
| Idéal pour | Applications intégrées nécessitant un stockage local fiable | Workflows analytiques dans Python/R ou dans des contextes sans serveur |
| Exemple de contexte de requête | SELECT * FROM utilisateurs WHERE id=1 ; | SELECT région, AVG(montant) FROM ventes GROUP BY région ; |
Qu'est-ce que SQLite ?
SQLite est l'une des bases de données les plus largement déployées dans le monde. Lancé en 2000, SQLite a été conçu comme un système de base de données léger et sans serveur. sans serveur.
Voici quelques-unes de ses principales caractéristiques :
- Autonome et sans serveur
- Configuration sans paramétrage
- Entièrement Conforme à la norme ACID
- Stockage orienté ligne
En raison de son architecture légère, il peut être utilisé dans les cas suivants :
- Applications mobiles (Android, iOS)
- Logiciel de bureau
- Systèmes embarqués tels que les appareils IoT
La principale force de SQLite réside dans sa simplicité et sa fiabilité. Les développeurs peuvent fournir une base de données unique sous forme de fichier avec leur application sans se soucier des dépendances externes.
Qu'est-ce que DuckDB ?
DuckDB est souvent considéré comme le SQLite de l'analyse de données. Lancé en 2019, DuckDB a été développé au CWI. L'objectif principal de l'utilisation de DuckDB était de disposer d'une solution de base de données OLAP en cours de traitement. solution de base de données OLAP en cours de traitement.
Voici quelques-unes de ses principales caractéristiques :
- Format de stockage en colonnes
- Optimisé pour les charges de travail OLAP
- Exécution vectorisée des requêtes
- Conception intégrée en cours de fabrication
- Prise en charge directe des formats de fichiers tels que Parquet et Arrow
Voici quelques cas d'utilisation typiques :
- Analyses interactives
- Workflows de science des données (Python, R, Jupyter)
- Pipelines ETL légers
Le principal avantage de DuckDB réside dans le fait qu'il offre la puissance des bases de données analytiques (telles que Snowflake ou BigQuery) dans un package intégré.
DuckDB par rapport à SQLite : Principales différences et similitudes
1. Installation et dépendances
SQLite
SQLite est réputé pour être indépendant de toute dépendance. Il se compile en une seule bibliothèque C qui peut être intégrée à pratiquement n'importe quelle application.
L'installation est minimale et peut être facilement téléchargée depuis le site Web de SQLite.
La portabilité est l'un de ses principaux atouts : il fonctionne de la même manière sous Windows, macOS, Linux, iOS et Android, sans nécessiter d'efforts supplémentaires.
DuckDB
DuckDB est également facile à installer, mais il est distribué sous forme de binaires séparés ou de paquets Python/R. paquets Python/R plutôt que d'être préinstallé de manière universelle.
Il comporte quelques dépendances supplémentaires, notamment lors de l'activation des intégrations avec Apache Arrow, Parquet ou Pandas. Pandas.
L'empreinte est encore modeste, mais comparé à SQLite, DuckDB nécessite une configuration légèrement plus complexe si vous souhaitez bénéficier de fonctionnalités avancées telles que des connecteurs de stockage dans le cloud ou l'intégration d'outils de science des données.
2. Formats et architecture de stockage
SQLite
Stocke les données dans un format basé sur des lignes, optimisé pour OLTP (traitement des transactions en ligne) telles que les insertions, les mises à jour et les suppressions.
La récupération d'une ligne complète est rapide, mais les requêtes analytiques qui ne scannent que quelques colonnes parmi des millions de lignes peuvent devenir lentes car des données inutiles sont lues.
DuckDB
DuckDB utilise un moteur de stockage en colonnes, spécialement conçu pour le traitement analytique en ligne (OLAP).
Le format en colonnes permet d'accélérer considérablement les requêtes qui agrègent de grands ensembles de données (par exemple, AVG(sales) ou COUNT(*)), car seules les colonnes pertinentes sont lues en mémoire.
Permet également une meilleure compression et une exécution vectorisée pour plus de rapidité.
Exemple : Une requête telle que « SELECT * FROM sales WHERE customer_id=123 » s'exécute plus rapidement sur SQLite, tandis qu'une requête telle que « SELECT AVG(amount) FROM sales GROUP BY region » s'exécute beaucoup plus rapidement sur DuckDB.
3. Charges de travail transactionnelles et analytiques
Les deux bases de données présentent également des différences en termes de charge de travail :
- OLTP (transactionnel) : Opérations courtes et fréquentes (par exemple, applications bancaires, profils d'utilisateurs, systèmes de point de vente). Ses priorités sont la faible latence, l'intégrité des données et l'accès simultané.
- OLAP (analytique) : Requêtes complexes sur de grands ensembles de données (par exemple, tableaux de bord, outils BI, analyse de données ad hoc). Ses priorités sont le débit, les performances de numérisation et la vitesse d'agrégation.
SQLite
SQLite est optimisé pour les opérations OLTP (insertion, mise à jour, suppression, recherche ponctuelle).
Par exemple :
- Applications mobiles stockant des données hors ligne.
- Les appareils IoT enregistrent les interactions des utilisateurs.
- Caches locaux dans les applications de bureau.
DuckDB
DuckDB est optimisé pour OLAP (agrégations, jointures, analyses).
Par exemple :
- Les scientifiques des données qui effectuent des agrégations sur des fichiers Parquet/CSV.
- Tableaux de bord interactifs Tableaux de bord BI où les requêtes résument des millions de lignes.
- Pipelines ETL/ELT nécessitant des transformations légères en mémoire.
4. Prise en charge et syntaxe SQL
Ensuite, examinons leur syntaxe SQL. Les deux implémentent un large sous-ensemble de la norme SQL avec des extensions ; aucun n'est entièrement conforme à la norme ANSI.
SQLite
- Prend en charge une grande partie de la norme SQL, mais exclut les constructions analytiques avancées.
- Idéal pour les opérations CRUD et les jointures plus simples.
- Prend en charge les fonctions de fenêtre et les CTE, mais ne dispose pas de fonctionnalités analytiques plus avancées telles que GROUPING SETS et certaines extensions d'agrégation.
Voici à quoi ressemble la syntaxe :
CREATE TABLE sales (
id INTEGER PRIMARY KEY,
product TEXT,
amount REAL,
sale_date TEXT
);
DuckDB
- Conformité beaucoup plus étroite à la norme ANSI SQL, avec une prise en charge étendue des fonctions de fenêtre, des CTE, des agrégations et des opérations sur les ensembles.
- Conçu pour offrir la même sensation de légèreté que PostgreSQL pour l'analyse.
- L'intégration avec Arrow et Pandas permet d'exécuter des requêtes SQL directement sur des ensembles de données externes sans avoir à les importer au préalable.
Voici un exemple similaire illustrant la syntaxe utilisée pour DuckDB :
CREATE TABLE sales (
id INTEGER,
product VARCHAR,
amount DOUBLE,
sale_date DATE
);
SQLite et DuckDB : Architecture fondamentale et philosophie de conception
En termes d'architecture fondamentale, SQLite et DuckDB sont toutes deux des bases de données intégrées et en cours de traitement. Cependant, leurs philosophies en matière de conception sont différentes.
SQLite privilégie la simplicité et la fiabilité des transactions, tandis que DuckDB est optimisé pour les charges de travail analytiques et l'intégration moderne de la science des données.
1. Architecture de stockage
Tout d'abord, les deux bases de données présentent des différences dans leur architecture de stockage.
SQLite
SQLite est basé sur les lignes, ce qui est idéal pour l'accès transactionnel. Cela signifie que des lignes entières sont stockées ensemble sur le disque.
Cette conception est avantageuse pour les charges de travail transactionnelles (OLTP), car l'insertion, la mise à jour ou la récupération d'un seul enregistrement ne nécessite généralement l'accès qu'à une seule ligne.
Les applications qui nécessitent un accès rapide et constant à des enregistrements individuels, tels que les profils utilisateur ou les détails de commande, fonctionneront efficacement dans ce modèle.
DuckDB
DuckDB adopte un format en colonnes, conçu pour analyser rapidement des milliards de lignes. Le format en colonnes consiste à regrouper les valeurs d'une même colonne sur le disque et en mémoire.
Le stockage en colonnes permet d'effectuer des requêtes analytiques (OLAP) très efficaces, car les agrégations, les filtres et les analyses ne nécessitent souvent que l'accès à un sous-ensemble de colonnes.
Les techniques de compression s'appliquent plus efficacement à l'ensemble des colonnes, ce qui réduit l'utilisation de la mémoire et du stockage tout en améliorant les performances d'analyse.
2. Méthodologies de traitement des requêtes
Ensuite, nous devrons examiner comment chacun d'entre eux traite les requêtes.
En général, le modèle SQLite est optimisé pour la simplicité et l'exactitude transactionnelle, tandis que le moteur vectorisé de DuckDB est conçu pour le débit et les performances analytiques.
SQLite
SQLite utilise un modèle traditionnel basé sur un itérateur, traitant une ligne à la fois via le pipeline de requêtes.
Cette approche d'exécution ligne par ligne est légère et s'aligne sur les charges de travail transactionnelles, où les requêtes impliquent souvent de petits ensembles de données et des insertions ou des mises à jour fréquentes.
Cependant, des goulots d'étranglement apparaissent lorsque les requêtes doivent analyser de grands ensembles de données, car l'évaluation ligne par ligne ajoute une surcharge.
DuckDB
DuckDB utilise l'exécution vectorisée des requêtes, traitant des lots de lignes (vecteurs) à la fois plutôt qu'une à la fois.
Cette approche minimise la charge du processeur, optimise l'utilisation des caches des processeurs modernes et permet le parallélisme SIMD (Single Instruction, Multiple Data).
L'exécution vectorisée est particulièrement avantageuse pour l'analyse : les opérations telles que les agrégations, les jointures et les filtres s'exécutent beaucoup plus rapidement sur de grands volumes de données.
Dans DuckDB, la requête suivante bénéficie du stockage en colonnes et du traitement vectorisé, ce qui la rend considérablement plus rapide.
SELECT region, AVG(amount)
FROM sales
GROUP BY region;
3. Architecture de base de données en cours de traitement
Enfin, SQLite et DuckDB sont des bases de données intégrées, ce qui signifie qu'elles s'exécutent au sein du processus de l'application hôte plutôt que sur un serveur de base de données distinct.
Cette architecture élimine la latence du réseau, simplifie le déploiement et réduit la charge opérationnelle liée à la gestion des services externes.
Cela les rend :
- Facile à distribuer
- Facile à mettre en œuvre
- Faible latence (aucune surcharge client-serveur)
SQLite
SQLite a été le pionnier du concept de base de données « sans serveur ». Cela signifie que vos applications sont directement liées à sa bibliothèque et que toutes les requêtes sont exécutées au sein même de l'application.
DuckDB
DuckDB suit une conception similaire en cours de traitement, mais l'applique à des contextes analytiques.
Afin d'éviter la charge liée au lancement de moteurs d'analyse externes, DuckDB exploite les environnements de science des données (Python, R ou même les notebooks Jupyter) en y exécutant des requêtes.
Analyse des performances et comparaison entre DuckDB et SQLite
Les performances constituent l'un des principaux facteurs de différenciation entre DuckDB et SQLite. Bien que les deux soient des bases de données intégrées, leurs priorités de conception influencent leur comportement sous différentes charges de travail.
En général, SQLite offre de solides performances pour les cas d'utilisation transactionnels, tandis que DuckDB est particulièrement performant dans les contextes analytiques.
1. Performances des requêtes analytiques
DuckDB :
- Surpasse SQLite pour les agrégations, les jointures et les regroupements.
- Permet d'interroger directement les fichiers Parquet/Arrow.
- DuckDB est conçu pour l'exécution de requêtes analytiques et surpasse régulièrement SQLite lors du traitement de grands ensembles de données.
Examinons comment cela peut être vérifié à l'aide d'une requête d'agrégation.
Supposons que nous disposions d'un ensemble de données de ventes (sales.csv) comprenant 10 millions de lignes contenant les informations suivantes : order_id, customer_id, amount et date.
SQLite (Python) :
Pour exécuter cette requête dans SQLite à l'aide de Python, nous devons charger le fichier CSV dans un DataFrame, le lire dans une base de données connectée à l'SQLite3, puis exécuter notre requête SQL à l'intérieur de celle-ci.
Voici un exemple de 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) :
Pour exécuter une requête similaire à l'aide de DuckDB en Python, il y a moins d'étapes à suivre. Un DataFrame n'est pas nécessaire.
Voici un exemple de 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. Performance de la charge de travail transactionnelle
En termes de charge de travail transactionnelle, chaque base de données présente des cas d'utilisation uniques.
SQLite est optimisé pour les charges de travail impliquant de nombreuses transactions et des requêtes ponctuelles. Il gère les opérations fréquentes INSERT, UPDATE et DELETE avec une surcharge très faible, ce qui le rend idéal pour les systèmes transactionnels embarqués.
SQLite prend en charge efficacement les insertions en masse à l'aide de transactions et offre de bonnes performances lorsque de petites mises à jour sont fréquemment nécessaires.
DuckDB, en revanche, se concentre sur les requêtes analytiques après l'ingestion des données plutôt que sur les mises à jour transactionnelles à haute fréquence.
3. Évolutivité et utilisation des ressources
SQLite
SQLite est léger et fréquemment utilisé pour les ensembles de données de petite à moyenne taille. Une seule requête s'exécute sur un thread et SQLite utilise un modèle à écriture unique avec lectures simultanées ; il ne parallélise pas une seule requête SELECT, ce qui peut limiter le débit analytique.
DuckDB
DuckDB prend en charge le parallélisme multicœur et les requêtes dépassant la capacité de la mémoire. Il s'adapte en tirant parti de l'exécution parallèle et peut se déporter sur disque si nécessaire, permettant ainsi des analyses hors mémoire.
Cela lui permet d'analyser des ensembles de données dépassant largement la mémoire système tout en conservant des performances proches de celles d'une exécution en mémoire.
4. Format de fichier et performances d'E/S
SQLite
SQLite stocke les données dans son format propriétaire basé sur des lignes, qui est portable et stable, mais qui manque d'interopérabilité directe avec les formats analytiques modernes. Les données doivent souvent être importées dans SQLite avant que les requêtes puissent être exécutées, ce qui ajoute une charge supplémentaire en termes d'E/S.
DuckDB
DuckDB prend en charge de manière native plusieurs formats de fichiers, notamment Parquet, Arrow et CSV, ce qui lui permet d'interroger directement les données sans conversion (par exemple, SELECT … FROM 'file.parquet').
Cela élimine la surcharge ETL et accélère l'analyse en ne lisant que les données requises à partir de formats en colonnes tels que Parquet.
Ingestion de données et interopérabilité dans DuckDB par rapport à SQLite
Les bases de données sont couramment utilisées pour ingérer de grandes quantités de données. Ensuite, nous examinerons les performances de chacun d'entre eux en matière de capacités d'ingestion et d'interopérabilité.
1. Formats de fichiers pris en charge et ingestion
DuckDB
DuckDB permet l'ingestion native des formats Parquet, Arrow et CSV. Il est possible d'exécuter des requêtes SQL directement sur Parquet sans avoir à l'importer dans un fichier de base de données.
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 nécessite l'importation de données externes dans son format de stockage avant que les requêtes puissent être exécutées.
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. Intégration avec des outils de science des données
DuckDB
DuckDB est étroitement intégré à pandas, R et Jupyter, et s'intègre directement aux DataFrame pandas, vous permettant de les traiter comme des tableaux SQL :
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 est compatible avec de nombreux langages de programmation, mais il est moins axé sur la science des données.
Par exemple, SQLite peut également interagir avec pandas, mais nécessite généralement davantage de code standard.
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. Liaisons linguistiques et API
SQLite
SQLite existe depuis 2000, ses liaisons sont donc extrêmement matures. Étant donné qu'il s'agit simplement d'une petite bibliothèque C, la plupart des langages bénéficient d'un support officiel ou communautaire.
Voici quelques exemples : C, Python (sqlite3), Java, PHP, et bien d'autres encore.
DuckDB
DuckDB est beaucoup plus récent, mais a été conçu en tenant compte des flux de travail liés à la science des données et à l'analyse. Ses contraintes sont moins nombreuses, mais elles sont très adaptées à la science des données.
Voici quelques exemples : Python, R, C++, JavaScript bindings.
Cas d'utilisation et domaines d'application
Bien que SQLite et DuckDB soient toutes deux des bases de données intégrées légères, elles ont des finalités très différentes.
SQLite est particulièrement performant dans les contextes transactionnels au niveau des applications, tandis que DuckDB est optimisé pour les charges de travail analytiques dans les domaines de la science des données et de l'intelligence économique. Dans certains cas, ils peuvent même se compléter mutuellement.
Veuillez examiner quelques exemples spécifiques ci-dessous :
1. Scénarios d'application de SQLite
SQLite est extrêmement léger, ce qui le rend idéal pour :
- Stockage des applications mobiles : SQLite est la base de données par défaut pour les applications Android et iOS, offrant un stockage local persistant sans nécessiter de serveur backend.
- Appareils IoT : Les appareils IoT légers s'appuient souvent sur SQLite en raison de son encombrement minimal et de ses exigences de configuration nulles.
- Mise en cache du navigateur : SQLite est couramment utilisé comme couche de cache dans les systèmes distribués ou comme stockage intermédiaire lors du transfert de données entre systèmes.
2. Applications analytiques DuckDB
DuckDB est étroitement lié aux flux de travail analytiques tels que les pipelines ETL. Voici un exemple de sa mise en œuvre en Python.
Utilisation de l'interface CLI DuckDB :
-- 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);
Veuillez maintenant exécuter le fichier dans le terminal :
duckdb -c ".read etl.sql"
Vous pouvez également utiliser DuckDB dans Python pour optimiser votre flux de travail d'analyse de données.
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. Scénarios hybrides et complémentaires
Analysez les données SQLite dans DuckDB :
DuckDB peut interroger directement les données contenues dans un fichier de base de données SQLite :
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)
Optimisation des performances et meilleures pratiques
SQLite et DuckDB sont tous deux conçus pour être efficaces, mais leurs performances peuvent varier considérablement en fonction de la manière dont les données sont ingérées, interrogées et gérées.
1. Insertions en masse et traitement efficace des données
SQLite
Pour les chargements de données volumineux, veuillez toujours utiliser des transactions. L'insertion de lignes une par une sans transaction oblige SQLite à valider chaque ligne individuellement, ce qui ralentit considérablement les performances.
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()
Le regroupement de vos données, comme dans l'exemple ci-dessus, améliore considérablement les performances.
DuckDB
DuckDB gère efficacement l'ingestion de grands ensembles de données, en particulier à partir de fichiers externes. Veuillez utiliser les commandes d'COPY s ou l'interrogation directe de Parquet/CSV pour accélérer les 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. Techniques d'optimisation des requêtes
SQLite:
Pour optimiser vos requêtes, veuillez utiliser des index pour les recherches.
CREATE INDEX idx_customer_id ON orders(customer_id);
Je recommanderais d'utiliser EXPLAIN QUERY PLAN pour analyser les chemins d'exécution et identifier les index manquants.
En règle générale, veuillez vous efforcer de simplifier les requêtes et d'éviter les jointures inutiles dans les environnements aux ressources limitées.
DuckDB
Pour DuckDB, il est possible d'utiliser l'élagage de colonnes et la descente de prédicats.
- Élagage des colonnes: DuckDB ne lit que les colonnes dont votre requête a réellement besoin. Cela permet de réduire les opérations d'E/S et d'accélérer les analyses, en particulier avec des tableaux volumineux ou des fichiers Parquet.
- Poussée de prédicat: DuckDB applique vos filtres WHERE à l'analyse des tables/fichiers afin d'ignorer les groupes de lignes/pages/fichiers qui ne correspondent pas. Cela permet de réduire considérablement le nombre d'octets lus en utilisant les statistiques des fichiers/partitions (par exemple, min/max Parquet).
Exemple de suppression de colonnes :
-- 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;
Exemple de prédicat 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. Considérations relatives à la maintenance et à l'exploitation
- s SQLite: Opérations régulières d'
VACUUMs pour récupérer de l'espace. Pour les applications intégrées, veuillez vous assurer que les E/S disque sont suffisantes et utiliser le mode WAL pour une meilleure durabilité et un accès simultané. - DuckDB: Optimisé pour l'analyse ; réglage minimal requis. Organisez les grands ensembles de données dans des fichiers Parquet partitionnés afin de tirer parti de l'élagage des partitions.Évaluez régulièrement les requêtes par rapport à des charges de travail échantillonnées afin d'ajuster les paramètres de parallélisme (via PRAGMA threads).
Développement, intégration et écosystème
Les bases de données doivent être bien intégrées afin de garantir un accès facile aux données. Nous allons maintenant examiner comment chaque base de données s'intègre à d'autres systèmes.
1. Prise en charge des langages de programmation et des API
- s SQLite: Large prise en charge linguistique. Offre l'une des gammes les plus étendues de liaisons linguistiques dans le domaine des bases de données. Des pilotes officiels et gérés par la communauté sont disponibles pour Python, Java, C#, C/C++, PHP, Go, Ruby, Rust et plus de 30 autres langages.
- DuckDB: Intégrations solides en science des données. Se concentre sur les liaisons orientées vers la science des données : prise en charge officielle de Python, R et C/C++.
2. Intégration de la science des données et de l'analyse
DuckDB: Fonctionne directement avec les DataFrame pandas.
Exemple :
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 prend également en charge les fonctions définies par l'utilisateur (UDF) en SQL et en Python, permettant ainsi des analyses avancées et des transformations personnalisées.
Exemple (UDF Python dans 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. Intégration du cloud et de l'infrastructure
SQLite
SQLite est une base de données locale conçue principalement pour le stockage local et intégré.
Il est utilisé dans les applications cloud natives comme couche de persistance légère ou cache, souvent à l'intérieur de conteneurs. Bien qu'il ne dispose pas de connecteurs de stockage cloud directs, les bases de données SQLite sont portables et peuvent être facilement transférées d'un environnement à l'autre.
DuckDB
DuckDB connaît une adoption croissante dans le cloud (interrogation de fichiers S3 Parquet) en raison de son optimisation pour les architectures de données modernes.
Il offre également une prise en charge native pour l'interrogation des formats de stockage cloud tels que les fichiers Parquet et Arrow sur AWS S3, Azure Blob Storageou Google Cloud Storage.
DuckDB s'intègre parfaitement dans les scénarios d'analyse sans serveur, où les données sont stockées dans un espace de stockage d'objets et interrogées à la demande sans nécessiter d'entrepôt lourd.
Limites et compromis
Malgré leurs atouts, DuckDB et SQLite présentent tous deux des contraintes inhérentes liées à leur philosophie de conception.
- Contraintes de concurrence et d'évolutivité:
- SQLite : Concurrence d'écriture limitée.
- DuckDB : Modèle de concurrence à processus unique.
- Contraintes liées à la gestion de la mémoire et des ressources :
- SQLite : Léger, mais ne peut pas s'adapter à des ensembles de données très volumineux.
- DuckDB : Peut être transféré sur disque, mais n'est pas conçu pour la durabilité transactionnelle à grande échelle.
- Lacunes en matière de fonctionnalités et de fonctionnalités:
- SQLite : Fonctions analytiques restreintes.
- DuckDB : Robustesse transactionnelle limitée.
- Compromis et limites en matière de performances:
- SQLite : Rapide pour les transactions, lent pour les analyses.
- DuckDB : Rapide pour l'analyse, plus lent pour les petites écritures.
SQLite et DuckDB : conclusions finales
DuckDB et SQLite remplissent tous deux des rôles importants mais distincts :
- Veuillez choisir SQLite si vous avez besoin d'une base de données transactionnelle simple et légère pour des applications et des systèmes embarqués.
- Veuillez choisir DuckDB si vous avez besoin d'analyses hautement performantes directement dans vos flux de travail Python/R.
Dans de nombreux cas, ils se complètent mutuellement : SQLite pour le stockage et les transactions, DuckDB pour les requêtes analytiques sur ces données. Le choix approprié dépend de la nature de votre charge de travail : s'agit-il davantage d'OLTP (transactions) ou d'OLAP (analyses) ?
Souhaitez-vous en savoir plus sur les bases de données telles que DuckDB et SQLite ? Veuillez consulter notre Guide du débutant sur SQLite et notre Introduction à DuckDB SQL.
FAQ DuckDB vs SQLite
Comment DuckDB gère-t-il les ensembles de données dont la taille dépasse la mémoire disponible ?
DuckDB utilise un moteur d'exécution vectorisé et peut transférer les résultats intermédiaires sur le disque lorsque les requêtes dépassent la mémoire RAM disponible. Cela lui permet de traiter des ensembles de données beaucoup plus volumineux que la mémoire tout en conservant des performances raisonnables, bien que la vitesse dépende fortement des E/S disque.
Quelles sont les principales différences de performances entre DuckDB et SQLite ?
SQLite est optimisé pour les charges de travail transactionnelles (OLTP) et excelle dans les petites insertions, les mises à jour et les recherches sur une seule ligne. DuckDB, quant à lui, est optimisé pour les charges de travail analytiques (OLAP), avec des agrégations, des jointures et des analyses plus rapides sur de grands ensembles de données grâce à sa conception en colonnes et à son exécution parallèle.
Est-il possible d'utiliser DuckDB pour des analyses en temps réel ?
DuckDB est particulièrement adapté aux analyses par lots ou interactives, et non aux flux continus en temps réel. Il est capable d'analyser rapidement les données récentes lorsqu'elles sont ingérées ou consultées à partir de fichiers, mais il ne dispose pas des capacités intégrées de streaming et d'ingestion à haute fréquence que l'on trouve dans les systèmes dédiés en temps réel.
Comment le stockage en colonnes de DuckDB améliore-t-il les performances des requêtes ?
Le stockage en colonnes permet à DuckDB de ne lire que les colonnes nécessaires à une requête, réduisant ainsi la charge d'E/S. Associé à la compression et à l'exécution vectorisée, cela améliore l'efficacité du cache et accélère les opérations telles que les agrégations et les filtres sur de grands ensembles de données.
Quelles sont les limites de l'utilisation de DuckDB pour les charges de travail transactionnelles à haute concurrence ?
DuckDB n'est pas conçu pour les systèmes transactionnels multi-utilisateurs. Il prend en charge les transactions ACID, mais son modèle de concurrence est limité, ce qui le rend inadapté aux environnements comportant de nombreux auteurs simultanés ou des mises à jour à haute fréquence. SQLite ou une base de données serveur est plus approprié pour ces scénarios.

Je m'appelle Austin, je suis blogueur et rédacteur technique et j'ai des années d'expérience en tant que data scientist et data analyst dans le domaine de la santé. J'ai commencé mon parcours technologique avec une formation en biologie et j'aide maintenant les autres à faire la même transition grâce à mon blog technologique. Ma passion pour la technologie m'a conduit à écrire pour des dizaines d'entreprises SaaS, inspirant les autres et partageant mes expériences.