2012-04-04 11 views
2

SQLiteのクエリで重大なパフォーマンス問題が発生しています。現在、テーブルには約20000のエントリがありますactivity_tblと約40テーブルactivity_data_tblです。下のクエリで使用される両方の列のインデックスがありますが、パフォーマンスには何の影響も与えないようです。SQLite - 選択式が非常に遅い

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 

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

あなたは私がこれをどのように最適化できるかについての提案はありますか?

+0

あなたは、インデックス( '.s')とスキーマを投稿することができますか? – netcoder

+0

2つのコメント:タイトルを変更して質問に回答しないでください。代わりに以下のいずれかの答えの横にチェックマークを入れてください(あなた自身の答えであれば、あなた自身の質問に返信し、正しい答えにすることができます)。また、小さな開始時間のフィルタリングでは、データの「形状」によっては、元のクエリと同じ結果が得られない場合があります。 –

答えて

0

時間欄にインデックスを入れてみてください。クエリを高速化する必要があります

+3

時間列はありません。 –

0

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

索引が役立つ唯一の場所で、あなたが持っていると仮定すると、b.data_idにあります。

+0

ありがとう、 – Teapot01

0

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

あなたはより頻繁に同様のタスクに直面している場合は、これを読んでください:http://www.sqlite.org/rtree.html