- SQLiteはディスク上にB木構造で保存される行指向ストレージで、VDBEという仮想マシンを使ってクエリを実行する。プラットフォームに依存せず、単一スレッドでほぼあらゆる環境で実行できる
- 汎用データベースだが、OLTP処理に優れている。2015年にバッファロー大学の研究チームは、ほとんどのクエリが単純なキー・バリュー検索と複雑なOLAPクエリであることを発見した
- ウィスコンシン大学マディソン校の研究チームは、分析クエリをより高速にするための取り組みを行った。DuckDBとStar Schema Benchmark(SSB)を使って性能を比較した
原因
- SQLiteが遅い理由を把握するため、
VDBE_PROFILEオプションを使ってVDBEの各命令が消費するCPUサイクルを測定した。
SeekRowIDとColumnという2つのopcodeが主な原因であることが判明した。
データベース結合
- データベースが結合を実装する方法には、ネステッドループ結合、ハッシュ結合、ソートマージ結合がある。
- SQLiteは最も単純な「ネステッドループ結合」を使用する。これはB木探索に似ており、コストが高い。
結合最適化の重要性
- 結合演算ではテーブルの順序が重要である。順序を変えると演算回数を大きく減らせる。これはNP困難問題である。
- ネステッドループ結合より優れた結合アルゴリズムが2つあるが、ハッシュ結合はメモリを多く消費し、SQLiteは主にメモリ制約のある環境で動作する。
- 研究チームはBloomフィルタを使って空間効率を高め、CPUキャッシュラインに収まるようにした。
FilterとFilterAddという2つのopcodeを追加した。
結果
- 最適化後のCPUサイクル分析では、大きな青いバーがほとんど消えた。
- SQLiteは7倍から10倍高速化した。この研究成果はSQLite v3.38.0に適用された。
- Bloomフィルタは 最小限のメモリオーバーヘッドでSQLiteのシンプルな実装によく適合し、既存のクエリエンジン内で動作する
3件のコメント
今バージョンを確認してみると、自分のシステムでは 3.42.0 を使っていますね。現時点での最新版は 3.47.2 です。
今使っているSQLiteのバージョンを確認してみないといけませんね。
実はこれとは別に、
openpyxlを使ってExcelファイルを生成しているのですが、かなり時間がかかるので、ほかのライブラリがあるか探してみる必要がありそうです。プロファイリングを試してみたほうがいいのではないでしょうか