私はパフォーマンスが重要なアプリケーションに取り組んできましたが、関連するクエリの 1 つが次の構造になっています (名前は変更されていますが、他には何もありません)。
SELECT x.* FROM a
LEFT OUTER JOIN (
SELECT c_a, c_b, c_c
FROM b
UNION ALL
SELECT c_a, c_b, c_c
FROM c
) AS x
ON a.c_a = x.c_a
WHERE a.c_d = ?
ORDER BY a.c_a
このクエリを実行EXPLAIN QUERY PLAN
しましたが、すべてのインデックスが適切に使用されているようです。コマンドライン クライアントを使用すると、このクエリは約 0.75 秒で完了します。これは、データベース内のデータ量を考えると、私が予想することです。
ただし、SQLite ライブラリを介して実行された同じクエリは、劇的に異なる動作を示します。プロファイラー データは、このクエリの1 回sqlite3_step()
の実行で、関数に費やされた時間が約 120 秒であることを示しています。ライブラリでは、この 1 秒未満のクエリに 2 分かかりますが、その理由についてはまったく説明がありません。
どちらの場合も、操作対象のデータベース ファイルはバイト単位で同一です。
SQLite ライブラリはバージョン 3.7.2 で、コマンドライン クライアントはバージョン 3.7.13 です。これが要因かどうかはわかりませんが、私にはありそうにありません。
私が試したこと:
- データベースのバキューム。パフォーマンスに統計的に有意な改善はありませんでした。
- ジャーナル モードの変更。この質問とは関係のない理由で、ロールバック ジャーナルの使用から WAL に切り替えましたが、これもパフォーマンスに統計的に有意な影響を与えました。