Je m'attendais à passer des fichiers ms-access aux fichiers SQLite pour mes besoins de base de données simples; pour les raisons habituelles: taille de fichier plus petite, moins de frais généraux, open source, etc.Comment accélérer la requête avec plusieurs INNER JOINs
Une chose qui m'empêche de faire le changement est ce qui semble être un manque de vitesse dans SQLite. Pour les requêtes SELECT simples, SQLite semble fonctionner aussi bien, ou mieux que MS-Access. Le problème se produit avec une requête SELECT assez complexe avec de multiples déclarations INNER JOIN:
SELECT DISTINCT
DESCRIPTIONS.[oCode] AS OptionCode,
DESCRIPTIONS.[descShort] AS OptionDescription
FROM DESCRIPTIONS
INNER JOIN tbl_D_E ON DESCRIPTIONS.[oCode] = tbl_D_E.[D]
INNER JOIN tbl_D_F ON DESCRIPTIONS.[oCode] = tbl_D_F.[D]
INNER JOIN tbl_D_H ON DESCRIPTIONS.[oCode] = tbl_D_H.[D]
INNER JOIN tbl_D_J ON DESCRIPTIONS.[oCode] = tbl_D_J.[D]
INNER JOIN tbl_D_T ON DESCRIPTIONS.[oCode] = tbl_D_T.[D]
INNER JOIN tbl_Y_D ON DESCRIPTIONS.[oCode] = tbl_Y_D.[D]
WHERE ((tbl_D_E.[E] LIKE '%')
AND (tbl_D_H.[oType] ='STANDARD')
AND (tbl_D_J.[oType] ='STANDARD')
AND (tbl_Y_D.[Y] = '41')
AND (tbl_Y_D.[oType] ='STANDARD')
AND (DESCRIPTIONS.[oMod]='D'))
Dans MS-Access, cette requête exécute environ 2,5 secondes. En SQLite, il faut un peu plus de 8 minutes. Cela prend autant de temps si j'exécute la requête à partir du code VB ou à partir de l'invite de commande à l'aide de sqlite3.exe.
Mes questions sont les suivantes:
- est-SQLite tout simplement pas optimisé pour gérer plusieurs déclarations INNER JOIN?
- Ai-je fait quelque chose de manifestement stupide dans ma requête (parce que je suis nouveau à SQLite) qui le rend si lent?
Et avant que quiconque suggère une technologie complètement différente, non je ne peux pas changer. Mes choix sont MS-Access ou SQLite. :)
UPDATE: Affectation d'un index pour chacune des colonnes de la base de données SQLite réduit le temps de recherche de plus de 8 minutes jusqu'à environ 6 secondes. Merci à Larry Lustig pour expliquer pourquoi l'INDEXing était nécessaire.
Utilisez-vous des INDEX? –
@Phill Pafford: Je n'utilise pas d'index sur les données MS-Access ou SQLite. J'essaie de comparer l'accès à sqlite donc j'ai laissé la même structure de données dans les deux. – Stewbob
Impossible de poster une réponse, donc d'essayer un commentaire: MS Access est très agressif sur l'indexation des colonnes en votre nom, alors que SQLite vous demandera de créer explicitement les index dont vous avez besoin. Ainsi, il est possible qu'Access ait indexé [Description] ou [D] pour vous mais que ces index sont manquants dans SQLite. Je n'ai pas d'expérience avec cette quantité d'activité JOIN dans SQLite. Je l'ai utilisé dans un projet Django avec une quantité relativement faible de données et je n'ai détecté aucun problème de performance. –