2017-03-07 6 views
1

にPRIMARY KEYカラムを使用していない私は、テストSQLiteデータベースに次のテーブルがある:SQLiteの:索引

CREATE TABLE "test" (ord INTEGER, room TEXT NOT NULL); 
CREATE INDEX test_room_idx on test(room, ord); 

CREATE TABLE "test2" (ord INTEGER PRIMARY KEY, room TEXT NOT NULL); 
CREATE INDEX test2_room_idx on test2(room, ord); 

両方のテーブル内のデータが同一で​​ある:150000がroom='zO'を有するの約180000行。

問題が与えられたroomためtest2上のクエリとord秒の小さな範囲がtest2_room_idxord列を使用しないことである:150000行の場合

sqlite> explain query plan SELECT * FROM test WHERE room = 'zO' AND ord between 500000 and 501000; 
selectid order  from  detail                   
---------- ---------- ---------- --------------------------------------------------------------------------------- 
0   0   0   SEARCH TABLE test USING COVERING INDEX test_room_idx (room=? AND ord>? AND ord<?) 
sqlite> explain query plan SELECT * FROM test2 WHERE room = 'zO' AND ord between 500000 and 501000; 
selectid order  from  detail               
---------- ---------- ---------- --------------------------------------------------------------- 
0   0   0   SEARCH TABLE test2 USING COVERING INDEX test2_room_idx (room=?) 

が、これは、あまりにも悪いことではありません私の生産データには何百万もの行があり、クエリは数秒で終了します。

私はANALYZEd両方のテーブルを持っています。この問題はINTEGER PRIMARY KEYの必要条件であるrowidに一致する列に固有のようです。

私の質問は以下のとおりです。

  • はなぜtest2_room_idxord列は、このクエリのために使用されていませんか?
  • ordPRIMARY KEYとして作成しないように、私の制作テーブルを再定義するのは短期間ですが、私はそれについて何かできることを提案していますか?

答えて

2

両方のクエリが最近のSQLiteバージョンで正しく最適化されているため、明らかにこれは(修正された)バグでした。

SQLiteを更新するだけです。

+0

私はそれを確認する必要があります。実際、それは3.11.1と3.12.0の間で修正されているようです。 – richvdh