2

SQLite でのクエリで、重大なパフォーマンスの問題が発生しています。現在、表 activity_tbl には約 20000 のエントリがあり、表activity_data_tblは約 40のエントリがあります。以下のクエリで使用される両方の列のインデックスがありますが、パフォーマンスにはまったく影響がないようです。

SELECT a._id, a.start_time + b.length AS time 
FROM activity_tbl a INNER JOIN activity_data_tbl b 
       ON a.activity_data_id = b._data_id 
WHERE time > ? 
ORDER BY 2 
LIMIT 1

ご覧のとおり、1 つの列と、2 つの列を加算して作成された値を選択します。a.start_timeまたはb.lengthを選択するだけでクエリが非常に高速になるため、これがパフォーマンスの低下の原因だと思います。

これを最適化する方法について何か提案はありますか?

4

3 に答える 3

0

このクエリは、計算された値でフィルタリングおよび順序付けを行っているため、フィルター部分のインデックスを使用して最適化することはできません。クエリを最適化するには、実際のテーブル列の 1 つ (開始時刻または長さ) でフィルター処理するか、クエリを実行する前に時間値を事前に計算する必要があります。

インデックスが役立つ唯一の場所は、b.data_id にあると思います。

于 2012-04-04T15:51:05.130 に答える
0

時間列にインデックスを付けてみてください。これにより、クエリが高速化されます

于 2012-04-04T15:32:23.877 に答える
0

複合インデックスが役立つ場合があります。ドキュメントによると、インデックスに十分な情報がある場合、SQLite はテーブルへのアクセスを回避しようとします。したがって、エンジンが宿題を行った場合、インデックスが where 句の値を計算するのに十分であることを認識し、時間を割くことができます。それが機能しない場合は、事前計算のみが行われます。

同様のタスクに直面することが多い場合は、これを読んでください: http://www.sqlite.org/rtree.html

于 2013-12-02T17:00:58.843 に答える