Я пытаюсь найти наилучший способ (в данном случае, вероятно, не имеет значения) найти строки одной таблицы на основе наличия флага и реляционного идентификатора в строке в другой таблице.
Вот схемы:
CREATE TABLE files (
id INTEGER PRIMARY KEY,
dirty INTEGER NOT NULL);
CREATE TABLE resume_points (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
scan_file_id INTEGER NOT NULL );
Я использую SQLite3
таблица файлов будет очень большой, обычно строки 10K-5M.
resume_points будет небольшим < 10K с только 1-2 различными scan_file_id
's
поэтому моя первая мысль была:
select distinct files.* from resume_points inner join files
on resume_points.scan_file_id=files.id where files.dirty = 1;
Сотрудник предложил включить соединение:
select distinct files.* from files inner join resume_points
on files.id=resume_points.scan_file_id where files.dirty = 1;
то я подумал, так как мы знаем, что количество различных scan_file_id
будет настолько малым, возможно, подселек будет оптимальным (в этом редком случае):
select * from files where id in (select distinct scan_file_id from resume_points);
выходы explain
имели следующие строки: 42, 42 и 48 соответственно.