私は再現することはできません。私は新鮮なSQLiteバージョン3.7.8がインストールに次のステートメントを実行:
create table person (id int not null primary key, name varchar(20));
insert into person values (1, 'a');
insert into person select id + 1, name || 'b' from person;
insert into person select id + 2, name || 'c' from person;
insert into person select id + 4, name || 'd' from person;
insert into person select id + 8, name || 'e' from person;
insert into person select id + 16, name || 'f' from person;
insert into person select id + 32, name || 'g' from person;
insert into person select id + 64, name || 'h' from person;
insert into person select id + 128, name || 'i' from person;
insert into person select id + 256, name || 'j' from person;
insert into person select id + 512, name || 'k' from person;
insert into person select id + 512, name || 'l' from person;
insert into person select id + 1024, name || 'l' from person;
insert into person select id + 2048, name || 'm' from person;
insert into person select id + 4096, name || 'n' from person;
insert into person select id + 8192, name || 'o' from person;
insert into person select id + 16384, name || 'p' from person;
insert into person select id + 32768, name || 'q' from person;
insert into person select id + 65536, name || 'r' from person;
select count(*) from person;
create table relation (id int, related int);
insert into relation select id, id + 1 from person;
insert into relation select id, id + 2 from person;
insert into relation select id, id + 3 from person;
insert into relation select id, id + 4 from person;
insert into relation select id, id + 5 from person;
insert into relation select id, id + 6 from person;
insert into relation select id, id + 7 from person;
insert into relation select id, id + 8 from person;
insert into relation select id, id + 9 from person;
insert into relation select id, id + 10 from person;
delete from relation where related not in (select id from person);
create index relatedToPerson on relation(related);
explain query plan select id from person
where id in (select id from relation where related = 2345);
クエリプラン文の結果:
0|0|0|SEARCH TABLE person USING COVERING INDEX sqlite_autoindex_person_1 (id=?)(~25 rows)
0|0|0|EXECUTE LIST SUBQUERY 1
1|0|0|SEARCH TABLE relation USING INDEX relatedToPerson (related=?) (~10 rows)
は、なぜそれがあなたのために動作しませんか?私は考えることができるの理由:
- 列PERSONIDが含まれていないあなたのテーブルの関係( は確認してください)あなたはSQLiteの別のバージョンを使用している
- あなたは、例えば、ユニークインデックスの他の制約を持っています。
上記のスクリプトを実行して、同じ結果が得られるかどうかを確認できますか?
サブクエリのデータセットが小さい場合、一時テーブルが機能する可能性があります。次のようなものがあります。 Personid Fromの選択(SELECT PersonId FROM relationship WHERE RelatedToPersonId = 12270351721); – DallinDyer
私は一時テーブルを試したが、それでもスキャンを生成した。 – goto10
'person'に行がない場合、' PersonId'が 'relationship'に存在しますか?そうでない場合、サブクエリ(おそらく 'distinct'を持つ)がクエリ全体を満足するのではないでしょうか? –