Ich versuche herauszufinden, die beste Möglichkeit, (wahrscheinlich spielt in diesem Fall keine Rolle), die Zeilen einer Tabelle zu finden, basierend auf der Existenz eines Flags und einer relationalen ID hintereinander in einer anderen Tabelle.SQLite3 Abfrageoptimierung Join vs Subselect
hier sind die Schemata:
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);
ich verwende SQLite3
dort Dateien Tabelle sehr groß sein wird, 10K-5M Reihen typisch. die resume_points wird mit kleinen < 10K sein nur 1-2 verschiedene scan_file_id
‚s
so mein erster Gedanke war:
select distinct files.* from resume_points inner join files
on resume_points.scan_file_id=files.id where files.dirty = 1;
ein Mitarbeiter schlugen vor Drehen der Verbindung um:
select distinct files.* from files inner join resume_points
on files.id=resume_points.scan_file_id where files.dirty = 1;
dann Ich dachte, da wir wissen, dass die Anzahl der verschiedenen scan_file_id
wird so klein sein, wäre vielleicht ein Subselect optimal (in diesem seltenen Fall):
select * from files where id in (select distinct scan_file_id from resume_points);
Die Ausgänge explain
hatten die folgenden Zeilen: 42, 42 und 48.
Dies hängt von Ihren Daten und Hardware. Das musst du selbst messen. –
Sie haben verpasst und files.dirty = 1 für die letzte Abfrage – eglasius