関数
参考:
SQLite 関数の使い方 | SQLite入門 (www.dbonline.jp)
Core Functions | SQLite Query Language [Official]
インデックス
参考:
SQLite3 のインデックスのベンチマーク | ぺけみさお
パフォーマンスチューニング
参考:
Increasing SQLite Performance | Devart blog
Let’s speed up SQLite | componavt
Pragma statements supported by SQLite | SQLite [Official]
journal_mode
DELETE
:トランザクション完了時にジャーナルを削除する。(デフォルト)TRUNCATE
:トランザクション完了時にジャーナルを削除する代わりにファイルサイズを 0 に切り詰める。PERSIST
:ジャーナルを削除する代わりにゼロ埋めを行う。MEMORY
:ジャーナルをメモリ上に置く。不用意なシステムダウンによりデータベースが破損する可能性がある。WAL
:Write-Ahead Log を使用する。データベースコネクションをクローズしても WAL ジャーナルモードは維持される。WAL モードのデータベースにはバージョン 3.7.0 以降の SQLite でのみアクセスできる。OFF
:ロールバックジャーナルを使用しない。アトミックなコミットやトランザクションの機能は使用できない。
参考:
SQLite のパフォーマンスチューニング、または DBIx::Sunny 0.16 の話 | blog.nomadscafe.jp
PRAGMA journal_mode – Pragma statements supported by SQLite | SQLite [Official]
synchronous
OFF
:OS にデータを渡した後は同期せずに次の処理を開始する。アプリケーションレベルではデータベースは破損しないが、ディスクに書き込む前に OS クラッシュあるいは電源喪失が起こるとデータベースは破損する。データの安全性は劣るが、同期的に書き込む場合に比べてコミットは何倍も高速に処理される。NORMAL
:古いファイルシステム上でジャーナルとしてDELETE
モードを使用した場合、ごく稀にデータベースが破損する可能性がある。WAL
モードを使用した場合、あるいはモダンなファイルシステムでDELETE
モードを使用した場合は、ほぼ安全である。WAL
ジャーナルモードとNORMAL
同期モードを使用した場合、OS クラッシュあるいは電源喪失時にトランザクションは場合によってロールバックされる。トランザクションはアプリケーションのクラッシュに対しては常に担保される。WAL
モードで動作させる場合、ほとんどのアプリケーションに対してNORMAL
同期モードは適切である。FULL
:VFS の xSync メソッドを使用して、次の処理が開始される前に全てのデータが安全にディスクに書き込まれることを担保する。これによって、OS クラッシュや電源喪失においてデータベースは破損しない。EXTRA
:DELETE
モードにおいてトランザクションをコミットする際に、ロールバックジャーナルを削除した後にジャーナルを保持するディレクトリが同期される。FULL
モードに加えて、コミット直後に電源喪失があった場合の耐障害性が担保される。
ジャーナルモードを WAL
に、同期モードを NORMAL
に設定する。
PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL;
参考:
SQLite のパフォーマンスチューニング、または DBIx::Sunny 0.16 の話 | blog.nomadscafe.jp
PRAGMA synchronous – Pragma statements supported by SQLite | SQLite [Official]
locking_mode
NORMAL
:書き込みあるいは読み出しの各トランザクションが完了した時にロックが解除される。(デフォルト)EXCLUSIVE
:データベースにコネクションが張られている間、共有ロックが取得されて解放されることはない。最初の書き込み時に共有ロックは取得される。
EXCLUSIVE
モードを使用する理由
- 他のプロセスがデータベースファイルにアクセスしないように排他的に使用する。
- ファイル操作を行うシステムコールを減らして、パフォーマンスを少し改善することができる。
WAL
モードのデータベースでは、共有メモリを使用することなくEXCLUSIVE
モードでアクセスできる。
ロック制御を EXCLUSIVE に設定する。
PRAGMA main.locking_mode = EXCLUSIVE;
データベースを指定しなかった場合、以後に接続されるデータベースも含めて全てのデータベースに適用される。
参考:
PRAGMA locking_mode – Pragma statements supported by SQLite | SQLite [Official]
メモリ使用量
参考:
How to reduce SQLite memory consumption? – Stack Overflow
COUNT のパフォーマンス
参考:
SQLite3 で大量データ+複雑な VIEW を COUNT(*) すると固まる (ほど遅い) | 与太郎プログラマの日記
大量の UPDATE / DELETE の使用を避ける
参考:
1万件を超えるなら UPDATE / DELETE は使っちゃダメ| Script
INSERT
参考:
SQLite のインサートが遅いので速度アップの方法を試してみる | ドラブロ
Squeezing Performance from SQLite: Insertions | Jason Feinstein
EXPLAIN QUERY PLAN
参考:
EXPLAIN QUERY PLAN | SQLite [Official]
全文検索
参考:
SQLite FTS3 and FTS4 Extensions | SQLite [Official]
SQLite FTS5 Extension | SQLite [Official]
巨大なデータベースを扱う
参考:
What are the performance characteristics of sqlite with very large database files? – Stack Overflow
比較
参考:
Realm と SQLite のパフォーマンス検証を行った話 – Qiita
パフォーマンス比較 Cassandra、Mongodb、SQLite、H2、MySQL、Postgres | cypher256’s blog
SQLite vs Pandas: Performance Benchmarks | The Data Incubator
SQLite Database Speed Comparison | SQLite [Official]
Tips
参考:
1万件を超えるなら UPDATE / DELETE は使っちゃダメ| Script
Everything You Need TO Know About Optimizing SQLite Is Here. | WhoIsHostingThis.com