Bonjour à tous et à toutes,
J'utilise la librairie sqlite3.
J'effectue un grand nombre de requêtes SELECT dans le cadre de mon programme, et une requête en particulier est particulièrement longue à exécuter : (j'ai volontairement changé le nom des tables et champs, ne cherchez pas un quelconque sens sémantique)
Cette requête, je le sais, est pleine de défauts. On peut faire mieux en terme de construction de la requête, mais je n'ai pas le droit de modifier la requête. Il faut que je trouve d'autres moyens pour améliorer son exécution : en effet, cette requête, qui n'a pas l'air bien méchante, met 20 secondes environ à s’exécuter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 SELECT DISTINCT IT1.ID_ITEM, IT1.NOM, IT1.TYPE, IT1.ID_LIVRE FROM table_item IT1, table_item IT2, table_item IT3, table_livre LI1, table_livre LI2, table_livre LI3, table_personne PE1, table_personne PE2 WHERE IT1.ID_LIVRE=LI1.ID_LIVRE AND LI1.NUM_LIVRE=444 AND IT1.TYPE = 'ITI' AND LI2.NUM_LIVRE=444 AND IT2.ID_ITEM = PE1.ID_ITEM_A AND IT1.ID_ITEM= PE1.ID_ITEM_B AND IT2.ID_LIVRE=LI2.ID_LIVRE AND IT2.ID_ITEM = 197 AND LI2.NUM_LIVRE=444 AND IT3.ID_ITEM = PE2.ID_ITEM_A AND IT1.ID_OBJET=PE2.ID_ITEM_B AND IT3.ID_LIVRE=LI3.ID_LIVRE AND IT3.ID_ITEM = 173 ORDER BY IT1.NOM;
J'ai donc essayé, en vain jusqu'à maintenant, d'optimiser l'exécution de cette requête sachant ceci :
Ce que j'ai essayé :
- Juste pour tester, j'ai bidouillé le code pour modifier le texte de la première query de ce genre, et l'ai remplacé par une query avec des INNER JOIN. Le temps d'exécution chute de 20 à 5 secondes (ce qui reste élevé je trouve). Malheureusement comme je l'ai dit précédemment je n'ai pas le droit de faire ceci.
- J'ai tenté de créer des indexes afin d'accélérer le parcours des tables. J'ai crée des indexes sur : table_personne(id_item_a) et table_livre(num_livre). Cela a eu pour résultat de tripler le temps d'exécution (???)
Ce que vous devez savoir : (pertinent ou pas pour la réflexion, à vous de juger)
- Aucune de mes tables ne comporte de foreign key. De ce que j'ai lu, surtout en ce qui concerne les select, la foreign key n'impacte pas sur la performance.
- La requête est effectuée sur des tables temporaires créées à partir de vues. Cette requête met donc en moyenne 20 secondes à s'exécuter, mais si je la copie dans SQLiteBrowser et l'effectue sur les vues, elle met quelques millisecondes.
- Afin de calculer ce temps d'exécution, j'ai effectué une toute petite modification de la fonction sqlite3_exec() : j'ai simplement ajouter un timer en début et fin de fonction et j'affiche le temps écoulé.
Je ne sais vraiment plus sur quelle piste partir, si quelqu'un a une idée je suis open !
Si vous avez besoin d'autres informations je suis à votre disposition.
Merci de votre patience.
Partager