0

スキーマ:

CREATE TABLE [Groups] ([Group] VARCHAR(50) NULL, [ArtNum] INTEGER NULL, [ID] VARCHAR(50)  NULL, [Time] INTEGER);
CREATE INDEX [GroupTime]   ON [Groups] ([Group], [Time] DESC);
CREATE INDEX [GroupArtNum] ON [Groups] ([Group], [ArtNum]);

次のクエリを最適化したいと思います。

 SELECT `ID` FROM `Groups` WHERE `Group`=? ORDER BY `Time` DESC LIMIT 1

GroupArtNum問題は、SQLiteがインデックスの代わりにインデックスを使用することを主張していることGroupTimeです。EXPLAIN QUERY PLAN以下を出力します。

SEARCH TABLE Groups USING INDEX GroupArtNum (Group=?) (~10 rows)
USE TEMP B-TREE FOR ORDER BY

興味深いのは、のArtNum代わりに並べ替えようとするとTime、非常に高速に実行されることです。

Timeと同じように、列には(64ビット)整数しかありませんArtNum

4

1 に答える 1

1
  1. 実行ANALYZE(特定の場合に役立つ場合と役に立たない場合があります)。また
  2. 句を使用INDEXEDして、特定のインデックスの使用を強制します(ただし、ドキュメントではこれを行うことを警告しています)。

    SELECT ID FROM Groups INDEXED BY GroupTime WHERE ...
    
  3. または、SQLite 3.7.15(リリース時)に更新します。SQLite3.7.15には、クエリプランナーが最適化されており、使用GroupTimeがより効率的であることが認識されます。
于 2012-12-06T17:52:21.377 に答える