Sto cercando di capire il modo migliore, (probabilmente non importa in questo caso) per trovare le righe di una tabella, in base all'esistenza di una bandiera e un ID relazionale di fila in un altro tavolo.SQLite3 query optimization join vs subselect
qui sono gli schemi:
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);
sto utilizzando SQLite3
ci file tabella sarà molto grande, le righe 10K-5M genere. i resume_points saranno piccoli < 10K con solo 1-2 scan_file_id
distinti l'
quindi il mio primo pensiero è stato:
select distinct files.* from resume_points inner join files
on resume_points.scan_file_id=files.id where files.dirty = 1;
un collega ha suggerito girando il join in giro:
select distinct files.* from files inner join resume_points
on files.id=resume_points.scan_file_id where files.dirty = 1;
poi Ho pensato che poiché sappiamo che il numero di distinti scan_file_id
sarà così piccolo, forse una sottoselezione sarebbe ottimale (in questo raro caso):
select * from files where id in (select distinct scan_file_id from resume_points);
le uscite explain
avevano le seguenti righe: 42, 42 e 48 rispettivamente.
Questo dipende dei dati e l'hardware. Devi misurare questo te stesso. –
Hai perso e files.dirty = 1 sull'ultima query – eglasius