Optimisation d'une requête SQL [RESOLU] - SQL/NoSQL - Programmation
Marsh Posté le 24-09-2009 à 23:05:09
On peut essayer différemment
D'abord, récupérer la liste des jours qui nous intéressent (facile) :
SELECT DISTINCT date FROM fichiers WHERE Poste='D' AND vIntegrees > -1
Requête complète :
SELECT cle, DATE_FORMAT(date, "%d/%m/%y" ) as dateF, nom, vIntegrees, commentaire
FROM fichiers WHERE date in (
SELECT DISTINCT date FROM fichiers WHERE Poste='D' AND vIntegrees > -1
) ORDER BY date DESC, nom
A voir si c'est plus performant
Marsh Posté le 25-09-2009 à 10:14:08
Code :
|
au passage le champs "date" utilise un mot-clé réservé, ce n'est pas très judicieux
Marsh Posté le 25-09-2009 à 14:14:26
couak : Merci : l'indexation du champ date améliore largement les choses (1s environ au lieu de 8-9s) !!! (et en effet le nom n'est pas très judicieux ...)
mrbebert : franchement, quand j'ai vu ta solution, je me suis dit : Bingo !!! c'est si évident !! et pourtant ... sur une petite base de test, ça triple le temps. et sur la base de travail, je suis obligé d'interrompre la commande, car elle semble ne jamais se terminer ... dommage : ta requête me plaisait beaucoup !!
Merci encore à vous deux pour le temps que vous m'avez accordé !!
Marsh Posté le 24-09-2009 à 17:43:59
Bonjour,
mysql> describe fichiers;
+-------------+--------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+------------+----------------+
| cle | int(11) | NO | PRI | NULL | auto_increment |
| nom | varchar(128) | NO | | | |
| commentaire | text | YES | | NULL | |
| vIntegrees | int(11) | NO | | 0 | |
| date | date | NO | | 0000-00-00 | |
| Poste | char(1) | NO | | D | |
+-------------+--------------+------+-----+------------+----------------+
6 rows in set (0.02 sec)
Je souhaite afficher l'ensemble des enregistrements du même poste 'D' pour chaque jour où au moins un d'entre eux a une valeur `vIntegrees`>-1.
Voici la requête que j'ai fait et qui fonctionne :
SELECT DISTINCT t1.cle, DATE_FORMAT(t1.date, "%d/%m/%y" ) as dateF, t1.nom, t1.vIntegrees, t1.commentaire FROM fichiers t1, fichiers t2 WHERE t1.Poste='D' AND t2.Poste='D' AND t1.date=t2.date AND (t1.vIntegrees > -1 OR t2.vIntegrees > -1) ORDER BY t1.date DESC, t1.nom
Un exemple de résultat :
Le soucis, c'est que cette requête met plus de 8 secondes à être traitée (ma table contient 4229 enregistrements pour 700Ko, et elle va encore gonfler avec le temps).
Je n'arrive pas à trouver une autre requête qui fonctionne et qui soit plus rapide. Pourtant, je suis sur que c'est possible (peut-être avec un "WHERE (SELECT..." ou un "HAVING" ), mais cela dépasse mes compétences ...
Si quelqu'un pouvait m'aider ... merci bien par avance !!!
Message édité par mv1 le 25-09-2009 à 14:14:57