essaie de créer un index qui porte à la fois sur id_product et action_date
en effet, si t'as beaucoup d'actions pour un même produit, tu vas avoir de sérieux problèmes pour évaluer le max(), et ensuite pour retrouver la ligne qui correspond à ce que t'as trouvé.
avec un index, tu devrais même plus avoir le temps de voir que t'as tapé sur [Enter]
tu peux aussi éventuellement passer par une auto-jointure et une clause HAVING... Ca peut éventuellement être plus rapide.
Avec une table toute pourrie pas bien indexée, la seconde solution prends 32% du lot SQL alors que la première prend 68% du lot avec SQL Server 2005 Express.
Code :
SELECT * FROM mention m1 WHERE m1.note = (SELECT max(m2.note) FROM mention m2 WHERE m2.libelle = m1.libelle) SELECT max(m1.note), m2.note, m2.libelle FROM mention m1 INNER JOIN mention m2 ON m2.libelle = m1.libelle GROUP BY m2.note, m2.libelle HAVING max(m1.note) = m2.note
|
Une fois l'index proposé, je passe de 200ms à 1ms pour les deux requêtes, et la proportion s'inverse : 49% pour la première, et 51% pour la seconde.
C'est donc à tester sur ton SGBD, tes index et ta volumétrie, y'a pas de conclusion universelle à tirer -mise à part que l'index améliore considérablement les performances -
=> Pour la première requête, en fait le plan d'exécution se simplifié énormément, tandis que pour la seconde, il se bordelise un max
L'index préconisé :
Code :
CREATE INDEX m_idx ON mention (libelle, note)
|
Avant index :
Après index :
Message édité par MagicBuzz le 28-03-2008 à 02:39:29