関数

参考:

SQLite 関数の使い方 | SQLite入門 (www.dbonline.jp)

Core Functions | SQLite Query Language [Official]

インデックス

参考:

SQLite3 のインデックスのベンチマーク | ぺけみさお

パフォーマンスチューニング

参考:

sqlite3 で使える PRAGMA 文 – Qiita

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

SQLite のジャーナルモード | なべ’s blog

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 クラッシュや電源喪失においてデータベースは破損しない。
  • EXTRADELETE モードにおいてトランザクションをコミットする際に、ロールバックジャーナルを削除した後にジャーナルを保持するディレクトリが同期される。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

What is a realistic, real-world, maximum size for a SQLite database? – Software Engineering Stack Exchange

比較

参考:

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

SQLite Optimization – Performance FAQ | Codificar

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です