10
votes

SQLITE3 Optimisation de la requête Joindre VS Subsence

J'essaie de comprendre la meilleure façon de comprendre (probablement dans cette affaire) de trouver les rangées d'une table, basée sur l'existence d'un drapeau et une pièce d'identité relationnelle consécutive dans une autre table .

Voici les schémas: p>

select * from files where id in (select distinct scan_file_id from resume_points);


2 commentaires

Cela dépend de vos données et de votre matériel. Vous devez mesurer cela vous-même.


Vous avez manqué et fichiers.dirty = 1 sur la dernière requête


5 Réponses :


1
votes

Depuis Files.Id code> est la clé principale, essayez Groupe code> ing par code> ce champ plutôt que de vérifier les fichiers distincts. * xxx pré>

Une autre option à prendre en compte pour la performance est d'ajouter un index à resume_point.scan_file_id code>. p>

CREATE INDEX index_resume_points_scan_file_id ON resume_points (scan_file_id)


0 commentaires

1
votes

Vous pouvez essayer existe , qui ne produira aucun fichier en double : xxx

bien sûr pourrait aide à avoir les index appropriés: xxx

si un index est utile dépendra de vos données.


0 commentaires

0
votes

Si la table "RESUME_POINTS" n'aura qu'un ou deux numéros d'identification de fichier distincts, il ne semble pas avoir besoin que d'une ou deux lignes, et semble avoir besoin de scan_file_id comme clé primaire. Cette table n'a que deux colonnes et le numéro d'identification n'a pas de sens.

et si c'est em> le cas, vous n'avez pas besoin de l'un des numéros d'identification. P>

pragma foreign_keys = on;
CREATE TABLE resume_points (
  scan_file_id integer primary key
);

CREATE TABLE files (
  scan_file_id integer not null references resume_points (scan_file_id),
  dirty INTEGER NOT NULL,
  primary key (scan_file_id, dirty)
);


0 commentaires

12
votes

TL; DR: La meilleure requête et l'index est la suivante:

select distinct files.* from resume_points inner join files on resume_points.scan_file_id=files.id where files.dirty = 1;
4.3 - 4.5ms with and without index

select distinct files.* from files inner join resume_points on files.id=resume_points.scan_file_id where files.dirty = 1;
4.4 - 4.7ms with and without index

select * from (select distinct scan_file_id from resume_points) d join files on d.scan_file_id = files.id and files.dirty = 1;
2.0 - 2.5ms with uniqueFiles
2.6-2.9ms without uniqueFiles

select * from files where id in (select distinct scan_file_id from resume_points) and dirty = 1;
2.1 - 2.5ms with uniqueFiles
2.6-3ms without uniqueFiles

SELECT f.* FROM resume_points rp INNER JOIN files f on rp.scan_file_id = f.id
WHERE f.dirty = 1 GROUP BY f.id
4500 - 6190 ms with uniqueFiles
8.8-9.5 ms without uniqueFiles
    14000 ms with uniqueFiles and fileLookup

select * from files where exists (
select * from resume_points where files.id = resume_points.scan_file_id) and dirty = 1;
8400 ms with uniqueFiles
7400 ms without uniqueFiles


0 commentaires

1
votes

Je pense que Jtseng a donné la solution.

select distinct scan_file_id from resume_points


0 commentaires