Próbuję znaleźć najlepszy sposób (prawdopodobnie nie ma znaczenia w tym przypadku), aby znaleźć wiersze jednej tabeli, na podstawie istnienia flagi i identyfikatora relacyjnego z rzędu w innej tabeli.Optymalizacja zapytań SQLite3 join vs subelement
tutaj są schematy:
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);
Używam SQLite3
tam pliki stół będzie bardzo duża, 10K-5M wiersze zwykle. się resume_points będzie mały < 10K z zaledwie 1-2 odrębne scan_file_id
„s
więc moja pierwsza myśl była:
select distinct files.* from resume_points inner join files
on resume_points.scan_file_id=files.id where files.dirty = 1;
współpracownik zasugerował, obracając się wokół dołączyć:
select distinct files.* from files inner join resume_points
on files.id=resume_points.scan_file_id where files.dirty = 1;
następnie Pomyślałem, ponieważ wiemy, że liczba różnych scan_file_id
będzie tak mała, być może podselekcja będzie optymalna (w tym rzadkim przypadku):
select * from files where id in (select distinct scan_file_id from resume_points);
Wyjścia explain
miały następujące wiersze: odpowiednio 42, 42 i 48.
To zależy od danych i sprzętu. Musisz to zmierzyć samodzielnie. –
Tęskniłeś i files.dirty = 1 przy ostatnim zapytaniu – eglasius