最終曎新:

【図解で比范】SQLite vs DuckDB — 組み蟌みデヌタベヌスを甚途で䜿い分ける


同じデヌタ、読むたずたりが違う SQLite行を扱うDuckDB列を扱うID商品売䞊1りんご5,0002バナナ3,2003みかん4,100ID商品売䞊1りんご5,0002バナナ3,2003みかん4,1001件の商品を曎新売䞊列をたずめお集蚈合蚈 12,300同じデヌタでも、埗意な凊理が違う 同じデヌタ、読むたずたりが違う SQLite行を扱うID商品売䞊1りんご5,0002バナナ3,2003みかん4,1001件の商品を曎新DuckDB列を扱うID商品売䞊1りんご5,0002バナナ3,2003みかん4,100売䞊列を集蚈合蚈12,300
行ず列の読み取りを簡略化した䟋商品・売䞊は仮の倀、金額は円。SQLiteでも集蚈、DuckDBでも曎新は可胜です。
ひよこ ひよこ
デヌタベヌスっおサヌバヌを立おないず䜿えないむメヌゞがあるんだけど、サヌバヌなしで動くものもあるの
ペンギン先生 ペンギン先生
あるよ「組み蟌みデヌタベヌス」っお呌ばれるタむプだね。アプリの䞭に盎接デヌタベヌス゚ンゞンが組み蟌たれおいお、別途サヌバヌを立おる必芁がないんだ。その代衚栌がSQLiteずDuckDBだよ。
ひよこ ひよこ
どっちも組み蟌みなのに、なんで2぀も必芁なの同じようなものじゃないのかな
ペンギン先生 ペンギン先生
実はデヌタの「埗意な扱い方」がたったく違うんだ。SQLiteはOLTP、぀たりトランザクション凊理が埗意。1件ず぀デヌタを远加・曎新・削陀するような操䜜に匷い。DuckDBはOLAP、぀たり分析凊理が埗意。倧量のデヌタをたずめお集蚈したり統蚈を取ったりするのに向いおいるんだよ。
ひよこ ひよこ
OLTPずOLAPっお、具䜓的にどう違うの
ペンギン先生 ペンギン先生
たずえばECサむトで考えおみよう。「ナヌザヌが商品を1個カヌトに入れる」「泚文を1件確定する」みたいな凊理がOLTP。䞀方、「先月の党商品の売䞊をカテゎリ別に集蚈する」「過去1幎間で売䞊が䌞びた商品トップ100を出す」みたいな凊理がOLAPだよ。扱うデヌタの「粒床」が党然違うんだね。
ひよこ ひよこ
なるほどでも、なんでそれぞれ埗意分野が違うの
ペンギン先生 ペンギン先生
デヌタの栌玍方匏が違うからなんだ。SQLiteは「行指向」で、1぀のレコヌドのデヌタをたずめお保存する。だから特定の1行を読み曞きするのが速い。DuckDBは「列指向」で、同じカラムのデヌタをたずめお保存する。「売䞊」など必芁な列をたずめお読み、集蚈する凊理に向いおいるんだ。実際の速床はむンデックスやデヌタ、ク゚リによっお倉わるよ。
ひよこ ひよこ
列指向っおそんなに速いのどのくらい差が出るものなの
ペンギン先生 ペンギン先生
デヌタの量やク゚リ、マシンによっお差は倧きく倉わるから「䜕倍速い」ずは蚀い切れないんだ。ただDuckDBは、たずたった倀を䞀床にたずめお凊理する「列指向・ベクトル化」ずいう実行方匏を採甚しおいお、公匏資料でもSQLiteなどの埓来型より分析凊理のオヌバヌヘッドが少ないず説明されおいるよ。しかもParquetやCSVファむルを盎接SQLで読めるから、わざわざむンポヌトしなくおもいいんだ。自分のデヌタで詊しお比べるのが確実だね。
ひよこ ひよこ
ファむルを盎接読めるのはすごく䟿利だねじゃあ党郚DuckDBにすればいいんじゃないの
ペンギン先生 ペンギン先生
そうもいかないんだ。DuckDBの公匏ドキュメントも、INSERTを1行ず぀倧量に実行するのは非効率だず説明しおいるよ。通垞の䜿い方では、同じデヌタベヌスファむルに耇数のプロセスから同時に曞き蟌むこずもできない別プロセスから曞き蟌むためのリモヌトプロトコルは、2026幎9月時点でベヌタ扱いだよ。モバむルアプリやIoTデバむスのように「小さなデヌタを頻繁に読み曞きする」堎面では、SQLiteの方が向いおいるね。
ひよこ ひよこ
぀たり、甚途によっお䜿い分けるのがベストっおこずだね実際にはどういう組み合わせがあるのかな
ペンギン先生 ペンギン先生
䞡方を組み合わせる構成も遞べるよ。たずえばアプリのデヌタ保存にはSQLiteを䜿い぀぀、たたったログデヌタの分析にはDuckDBを䜿うパタヌン。DuckDBのsqlite拡匵で既存のSQLiteファむルを参照できるから、コピヌせずに詊せる。ただしファむルの圢匏が自動でDuckDB圢匏になるわけではないよ。
ひよこ ひよこ
組み蟌みDBだけでそこたでできるんだね。サヌバヌ型のデヌタベヌスはもういらないのかな
ペンギン先生 ペンギン先生
さすがにそれは蚀い過ぎかな。耇数のサヌバヌから同時にアクセスする必芁がある堎合や、同時に曞き蟌むナヌザヌが倚い堎合、耇数のマシンで運甚する必芁がある堎合はPostgreSQLやClickHouseのようなサヌバヌ型も怜蚎しよう。デヌタ容量だけで組み蟌みDBが䜿えないずは決たらないんだ。SQLiteの公匏資料も、こうした堎面ではクラむアント/サヌバヌ型を勧めおいるよ。でも「1台のマシンで完結する」甚途なら、SQLiteずDuckDBの組み合わせでかなりのこずができるよ。たずは自分の甚途がトランザクション寄りか分析寄りかを芋極めお、適材適所で遞ぶのが倧事だね。

どちらを遞ぶ甚途ず同時曞き蟌みで比范

確認するこずSQLiteDuckDB
䞻な甚途アプリのデヌタ保存・小さな曎新ロヌカルの分析・集蚈
集蚈可胜。必芁なむンデックスも怜蚎倚くの行から必芁な列を読む分析に適する
曞き蟌み同時に曞き蟌めるのは1぀。凊理を順番にする通垞のDBファむルは1プロセスから読み曞き。内郚の耇数スレッドは利甚可胜
Parquetを分析暙準のSQL機胜だけで盎接読む甚途ではないファむルを盎接SQLで読める
䜵甚SQLiteファむルを保存先にするsqlite拡匵でSQLiteを参照する

同時アクセスの制玄は「接続できる人数」ずは違いたす。SQLiteに耇数の接続があっおも、曞き蟌みは順番になりたす。DuckDBの説明は通垞のプロセス内動䜜に぀いおで、別途サヌバヌ構成を採る堎合の条件は区別しおください。

DuckDBからSQLiteを読むず自動で列指向になる

ATTACHしただけでは、SQLiteファむルがDuckDBの列指向圢匏に倉換されるわけではありたせん。 sqlite拡匵はク゚リ時にSQLite偎のテヌブルを読みたす。コピヌ䞍芁で利甚できる䟿利さず、DuckDBネむティブのテヌブルず同じ性胜が出るかは別です。

たずえば怜蚌甚のsample.dbにordersテヌブルがある堎合、DuckDB偎で次のように参照できたす。sqlite拡匵を利甚できる環境が前提です。

ATTACH 'sample.db' AS app (TYPE sqlite, READ_ONLY);
SELECT COUNT(*) AS order_count FROM app.orders;

この䟋は読み取り専甚で接続したすが、拡匵自䜓は曞き蟌みも可胜です。本番ファむルではなく怜蚌甚デヌタで詊し、SQLiteずDuckDBの型の扱いの差も確認しおください。

Parquetを集蚈したい堎合

amount列のあるorders.parquetをDuckDBで集蚈する䟋です。DBテヌブルぞ事前にむンポヌトする必芁はありたせん。

SELECT SUM(amount) AS total_amount
FROM read_parquet('orders.parquet');

ファむルの圧瞮方匏、必芁な列、絞り蟌み条件で凊理量が倉わりたす。単に「SQLiteより䜕倍速い」ずせず、同じデヌタず集蚈内容で確認したしょう。

補足

SQLiteでも小さなデヌタの集蚈はできたすし、DuckDBもトランザクションを扱えたす。この蚘事の分け方は蚭蚈の埗意・䞍埗意で、片方しか䜿えないずいう意味ではありたせん。速床は環境ずデヌタで倉わるため、数字はこの蚘事では瀺しおいたせん。

SQLiteの読み取りず曞き蟌みは党郚盎列になる

曞き蟌みを同時に行えるのは1぀ですが、WALモヌドでは読み取りず曞き蟌みを䞊行させられたす。 「SQLiteは1人しか接続できない」ずいう意味ではありたせん。ただしWALにもチェックポむントなどの運甚があり、モヌドを倉えれば同時曞き蟌みたで増えるわけではありたせん。

SQLiteの行を頻繁に曎新するアプリず、売䞊列をたずめお集蚈する分析では、読む範囲も凊理の頻床も違いたす。図は同じ商品のデヌタを䜿い、この埗意分野の違いを瀺しおいたす。速さそのものを枬った図ではありたせん。

遞び方のたずめ

たずアプリの保存・曎新が䞭心ならSQLite、CSVやParquetの分析が䞭心ならDuckDBを怜蚎したす。すでにSQLiteにデヌタがあるならsqlite拡匵で詊し、必芁に応じお分析甚のコピヌを䜜る方法もありたす。䜵甚では型の扱いず曞き蟌みの競合を確認しおください。

参考資料

確認日2026幎10月4日。

  • SQLiteAppropriate Uses For SQLite — 曞き蟌みは同時に1぀、ネットワヌク越し・倧芏暡デヌタではクラむアント/サヌバヌ型を怜蚎。

  • DuckDBWhy DuckDB — 分析OLAP向け、列指向・ベクトル化の実行゚ンゞン、プロセス内で動䜜。

  • DuckDBConcurrency — 耇数プロセスからの曞き蟌みの制玄、リモヌトプロトコルはベヌタ。

  • DuckDBInserting Data — 1行ず぀のINSERTを避ける掚奚。

  • DuckDBSQLite Extension — ATTACHでSQLiteファむルを読み曞き、型の違いず曞き蟌みの制玄。

  • DuckDB — Reading and Writing Parquet Filesread_parquet、列・条件による読み取りの最適化。

  • SQLite — Write-Ahead Logging読み曞きの䞊行性ず同時曞き蟌みの制玄。

  • DuckDB — ATTACH and DETACH読み取り専甚の接続ずファむル圢匏の指定。