これは、SQLite が使用可能なインデックスの使用を拒否するのはなぜですか? に関連しています。
データベースを作成するクエリは次のとおりです。
CREATE TABLE foo(id TEXT);
CREATE INDEX `foo.index` ON foo(id);
CREATE TABLE bar(id TEXT);
CREATE INDEX `bar.index` ON bar(id);
CREATE VIEW baz AS SELECT id FROM foo UNION ALL SELECT id FROM bar;
CREATE TABLE bam(ID TEXT, 値 TEXT);
INSERT INTO foo VALUES('123');
INSERT INTO foo VALUES('1123');
INSERT INTO foo VALUES('2123');
INSERT INTO foo VALUES('3123');
INSERT INTO バー VALUES('44123');
INSERT INTO バー VALUES('441123');
INSERT INTO バー VALUES('442123');
INSERT INTO バー VALUES('443123');
の結果EXPLAIN QUERY PLAN SELECT * FROM baz LEFT JOIN bam ON baz.id=bam.id WHERE baz.id IN ('123', '234');は次のとおりです。
SCAN TABLE foo (~1000000 行) SCAN TABLE バー (~1000000 行) 複合サブクエリ 2 および 3 (UNION ALL) SCAN サブクエリ 1 (~2000000 行) EXECUTE LIST サブクエリ 4 AUTOMATIC COVERING INDEX (id=?) を使用してテーブル bam を検索 (~7 行)
編集:興味深いことにEXPLAIN QUERY PLAN SELECT * FROM (SELECT * FROM baz WHERE baz.id IN ('123', '234')) AS t LEFT JOIN bam ON t.id=bam.id ;、インデックスを使用してもインデックスは使用EXPLAIN QUERY PLAN SELECT * FROM baz WHERE baz.id IN ('123', '234');されませんが、使用すると使用されます。何が起こっている?
foo と bar のインデックスを使用しないのはなぜですか?? リンクされた質問で明らかなように、JOINセクションなしでインデックスを使用します。
SQL フィドル: http://sqlfiddle.com/#!7/32af2/14 (WebSQL を使用)