はじめに
SQLite のメイン開発者である Richard Hipp 氏が以前、「SQLite は進化していて、バージョンアップを繰り返して、性能も良くなっています。」と言っていたことを思い出したことと、CentOS7 の SQLite パッケージが古くて気になっていたので、ちょっとバージョン毎の性能を測定してみました。
測定環境
測定は以下の環境で測定しました。
CPU : Intel Core i7-8700, OS : CentOS 7.7, メモリ : 4GB, ストレージ : HDD(SATA,1TB,7200rpm, キャッシュ:64MB)
測定方法
SQLite 3.0 ~ 3.31 までを入手し、それぞれのSQLiteを以下の手順でそれぞれの1トランザクション、100万レコード( 108 Byte )時間を測定しています。
- 新規データベースのオープン、テーブルの作成
- 100万レコードのINSERT
- 100万レコードのSELECT COUNT()
- 100万レコードのUPDATE
- 100万レコードのDELETE
- VACUUM
- データベースのクローズ、データベースファイルの削除
測定プログラムは、GitHub にアップしています。
https://github.com/kanegoon/sqlite-evaluation/blob/master/src/evalver.c
また、測定プログラムの実行結果は以下のようになります。
$ ./evalver
Version Evaluation, SQLite3 version = 3.0.8
INSERT : 6.668143580 (sec)
SELECT : 0.318649103 (sec)
UPDATE : 6.946012056 (sec)
DELETE : 1.056959430 (sec)
VACUUM : 0.993167611 (sec)
測定結果
1. INSERT
100万レコードのINSERTを測定して、結果は以下のようになりました。少しづつ性能が改善していって、Version 3.16.2 で最新バージョンと同じ性能なりました。
2. SELECT COUNT()
INSERTされた 100万レコードの SELECT COUNT() を測定して、結果は以下のようになりました。Version 3.12.3 で性能が大きくに改善しています。
3. UPDATE
100万レコードの UPDATE を測定して、結果は以下のようになりました。少しづつ性能が改善していって、Version 3.16.2 で最新バージョンと同じ性能なりました。
4. DELETE
100万レコードの DELETE を測定して、結果は以下のようになりました。Version 3.3.17 で大きく性能が改善して、さらに Version 3.12.3 で大きく性能改善しています。
5. VACUUM
100万レコードの DELETE の後、VACUUMを測定して、結果は以下のようになりました。Version 3.7.17 で大きく性能が改善して、さらに Version 3.12.3 で大きく性能改善しています。
まとめ
Hipp 氏が言っている「バージョンアップでSQLiteの性能が向上する」ことを同一環境で確認しました。性能だけで考えると SQLite 3.17.0 以上、安定も考えると 3.22.0 以上を使いたいとこです。
組み込みシステムや社会インフラシステムで、SQLiteを使用している場合、長い間、バージョンアップをしていない可能性があります。また、CentOS7 の SQLite は Version 3.7.17 なので、性能を考えると、別途、最新版を入手して使用した方が良いです。
$ sudo yum list available | grep sqlite.i686
sqlite.i686 3.7.17-8.el7_7.1 updates
もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。