2

私はパフォーマンスが重要なアプリケーションに取り組んできましたが、関連するクエリの 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 に切り替えましたが、これもパフォーマンスに統計的に有意な影響を与えました。
4

2 に答える 2

1

オブザーバーと参加者にクロージャーを提供するために、SQLite3.7.13にアップグレードすることでこの問題は解決したようです。現在、1.5秒が費やされていますが、sqlite3_step()これは明らかに劇的な改善です。3.7.2にはバグがあるか、最適化が欠落しているため、クエリの実行に必要な時間が長くなっているようです。

奇妙な振る舞いの他の例には、60秒の倍数の遅延も含まれていました。これは、3.7.2のロック関連のバグ(EthanBの回答を参照)がその後解決されたことを示している可能性があります。

于 2012-08-22T18:51:48.163 に答える
0

SQLite ライブラリを実行しようとすると、コマンドライン クライアントがデータベースをロックしていますか? 60 秒が SQLite クエリのタイムアウトだったことを思い出すようです (NHibernate クライアントで遭遇しました)。

于 2012-08-22T17:44:00.830 に答える