これは、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 を使用)