Optimisation de requête imbriquée

Optimisation de requête imbriquée - SQL/NoSQL - Programmation

Marsh Posté le 17-11-2009 à 10:35:01    

Bonjour,  
je suis  loin d'être un expert en SQL. Je désire optimiser  une requête pour que celle ci soit plus rapide:
 
Ma table "event" se compose ainsi:
Tag   |              Valeur                  |       DateEvent  
Elle est remplie d'enregistrement datés.
 
Je recherche le dernier enregistrement précédant une date précise pour une liste de variable (Tag) prédéfinie.
 
Pour l'instant j'exécute cette requête pour chaque Tag . Mais j'aimerai réduire son temps d'exécution
SELECT Valeur FROM event WHERE Tag ='%1' AND DateEvent =  (Select  Max(DateEvent ) FROM event  Where Tag ='%1' AND DateEvent  < '%2' )
 
%1 est le nom d'un Tag
%2 est la Date limite
 
Je pense que le plus rapide serait de réaliser une seule requête qui sortirait une table Tag, Valeur mais je ne vois pas bien comment réaliser cela. C'est pourquoi je demand votre aide sur ce point
 
Je travaille sur une Base SQL server via ODBC
 
Merci d'avance
 
g,
 
 
EDIT: Un début de réponse ici: je creuse Bon j'ai un début de piste ici:
http://www.techonthenet.com/sql/max.php


Message édité par Profil supprimé le 17-11-2009 à 11:23:06
Reply

Marsh Posté le 17-11-2009 à 10:35:01   

Reply

Marsh Posté le 17-11-2009 à 13:23:06    

Salut,

 

select valeur
from event
where tag = '%1'
and DateEvent < '%2'
group by tag
having DateEvent = max(DateEvent)

 

C'est la clause HAVING qui te permet de n'obtenir que la ligne voulue.


Message édité par Fred999 le 17-11-2009 à 13:23:15
Reply

Marsh Posté le 17-11-2009 à 14:00:57    

Merci Fred 999 pour ta réponse, mais je pense que l'idéal c'est de recuperer une liste avec tous les TAGS sinon je dois faire autant de requete qu'il y a de tags (et y'en a un certain nombre)....
Le group by est bien la solution que j'ai implémentée ainsi  
 
SELECT EDB.tagname,EDB.valuestring,EDB. DateEvent
FROM event as EDB,  
Select  Max(DateEvent) as MaxDate, tag
FROM eventdbww WHERE  DateEvent < '%2' GROUP BY tag HAVING tag IN (%1) )  maxresults
WHERE EDB.tag=maxresults.tag AND EDB.DateEvent =maxresults.MaxDate
 
Pour ton exemple , je crois que tu ne peux utiliser dans le having qu'une clause se reportant au champs mentionné dans le GROUP BY (En fait chez moi ca fait une erreur ton code.

Reply

Marsh Posté le 17-11-2009 à 15:08:56    

ah tu veux tous les tags d'un coup ?

 

select valeur, max(DateEvent)
from event
where DateEvent < '%2'
group by tag
having DateEvent = max(DateEvent)

 

si tu ne veux qu'une liste de tags, fais un tag in (liste), je pense que ce sera + rapide que ton select imbriqué


Message édité par Fred999 le 17-11-2009 à 15:09:34
Reply

Marsh Posté le 17-11-2009 à 17:04:34    

euh, faut pas le champ "tag" dans le select pour que la clause group by fonctionne :??:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-11-2009 à 17:14:28    

Chez moi ça marche comme ça (en transact-sql), j'avoue que c'est pas très joli comme code :c


Message édité par Fred999 le 17-11-2009 à 17:14:47
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed