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_idx
のord
列を使用しないことである: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=?)
が、これは、あまりにも悪いことではありません私の生産データには何百万もの行があり、クエリは数秒で終了します。
私はANALYZE
d両方のテーブルを持っています。この問題はINTEGER PRIMARY KEYの必要条件であるrowid
に一致する列に固有のようです。
私の質問は以下のとおりです。
- はなぜ
test2_room_idx
のord
列は、このクエリのために使用されていませんか? ord
をPRIMARY KEY
として作成しないように、私の制作テーブルを再定義するのは短期間ですが、私はそれについて何かできることを提案していますか?
私はそれを確認する必要があります。実際、それは3.11.1と3.12.0の間で修正されているようです。 – richvdh