2011-04-18 3 views
1

Je fais une grande base de données qui, à cause de cette question, disons, contient 3 tables:Accélérez SQL sélectionnez dans SQLite

A. Tableau « Employés » avec des champs:

id = ENTIER PRIMAIRE INDEX AUTOINCREMENT

d'autres n'importe

B. Tableau "Job_Sites" avec des champs:

id = ENTIER PRIMAIRE INDEX AUTOINCREMENT

D'autres ne comptent pas

C. Tableau "avec des champs" Les journées de travail:

id = ENTIER PRIMAIRE INDEX AUTOINCREMENT

emp_id = est une clé étrangère à Employees (id)

job_id = est une clé étrangère à Job_Sites (id)

datew = ENTIER qui signifie la journée de travail réelle, représentée par une date Unix en secondes depuis minuit Au 1 er janvier, 1970


L'opération la plus courante dans cette base de données est d'afficher journées de travail pour un employé spécifique. J'exécute l'instruction select suivante:

SELECT * FROM jours de travail OÙ emp_id = 'ID réel de l'employé' ET job_id = 'Actual ID du site d'emploi' ET datew> = D1 ET datew < D2

Je dois signaler que D1 et D2 sont calculés pour le début du mois en recherche et pour le mois suivant, respectivement.

J'ai en fait deux questions:

  1. Dois-je mettre tous les champs comme index en dehors des index primaires? (Désolé, je semble mal comprendre le concept d'indexation)

  2. Y at-il un moyen de réécrire l'instruction Select pour l'accélérer peut-être. Par exemple, la plupart des contrôles seraient de voir que l'ID de l'employé et l'ID du site de travail correspondent. Peut-être qu'il y a un moyen de le diviser?

PS. J'ai oublié de dire que j'utilise SQLite dans une application Windows C++.

Répondre

2

Si vous utilisez la requête ci-dessus souvent, vous pouvez obtenir de meilleures performances en créant un index multicolonne contenant les colonnes dans la requête:

CREATE INDEX WorkdaysLookupIndex ON Workdays (emp_id, job_id, datew); 

Parfois, il vous suffit de créer l'index et essayez vos questions à voir ce qui est le plus rapide