13 ポイント 投稿者 GN⁺ 2024-12-23 | 3件のコメント | WhatsAppで共有
  • SQLiteはディスク上にB木構造で保存される行指向ストレージで、VDBEという仮想マシンを使ってクエリを実行する。プラットフォームに依存せず、単一スレッドでほぼあらゆる環境で実行できる
  • 汎用データベースだが、OLTP処理に優れている。2015年にバッファロー大学の研究チームは、ほとんどのクエリが単純なキー・バリュー検索と複雑なOLAPクエリであることを発見した
  • ウィスコンシン大学マディソン校の研究チームは、分析クエリをより高速にするための取り組みを行った。DuckDBとStar Schema Benchmark(SSB)を使って性能を比較した

原因

  • SQLiteが遅い理由を把握するため、VDBE_PROFILEオプションを使ってVDBEの各命令が消費するCPUサイクルを測定した。
  • SeekRowIDColumnという2つのopcodeが主な原因であることが判明した。

データベース結合

  • データベースが結合を実装する方法には、ネステッドループ結合、ハッシュ結合、ソートマージ結合がある。
  • SQLiteは最も単純な「ネステッドループ結合」を使用する。これはB木探索に似ており、コストが高い。

結合最適化の重要性

  • 結合演算ではテーブルの順序が重要である。順序を変えると演算回数を大きく減らせる。これはNP困難問題である。
  • ネステッドループ結合より優れた結合アルゴリズムが2つあるが、ハッシュ結合はメモリを多く消費し、SQLiteは主にメモリ制約のある環境で動作する。
  • 研究チームはBloomフィルタを使って空間効率を高め、CPUキャッシュラインに収まるようにした。FilterFilterAddという2つのopcodeを追加した。

結果

  • 最適化後のCPUサイクル分析では、大きな青いバーがほとんど消えた。
  • SQLiteは7倍から10倍高速化した。この研究成果はSQLite v3.38.0に適用された。
  • Bloomフィルタは 最小限のメモリオーバーヘッドでSQLiteのシンプルな実装によく適合し、既存のクエリエンジン内で動作する

3件のコメント

 
porteleaf 2024-12-24

今バージョンを確認してみると、自分のシステムでは 3.42.0 を使っていますね。現時点での最新版は 3.47.2 です。

 
halfenif 2024-12-24

今使っているSQLiteのバージョンを確認してみないといけませんね。

実はこれとは別に、openpyxlを使ってExcelファイルを生成しているのですが、かなり時間がかかるので、ほかのライブラリがあるか探してみる必要がありそうです。

 
savvykang 2024-12-24

プロファイリングを試してみたほうがいいのではないでしょうか