[SQL] optimisation de requête....

optimisation de requête.... [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 24-07-2003 à 14:40:54    

Tout est dans le sujet :
 
 


SELECT COR_ID_ZONE, COR_SOCIETE, COR_IDSERVICE, COR_CATEGORIE,
       COR_DEBUT_DATE_EFFET, COR_VALEUR, COR_ID_OPERATEUR
  FROM CORRECTIF
 WHERE COR_DEBUT_DATE_EFFET < SYSDATE
   AND COR_ID_ZONE = 9
   AND COR_SOCIETE = '147'
   AND COR_IDSERVICE = '1'
   AND COR_CATEGORIE = 'F76'
   AND COR_STATUT = 1
   AND COR_DEBUT_DATE_EFFET = (
         SELECT MAX(COR_DEBUT_DATE_EFFET)
     FROM CORRECTIF
    WHERE COR_ID_ZONE = 9
      AND COR_SOCIETE = '147'
      AND COR_IDSERVICE = '1'
      AND COR_CATEGORIE = 'F76'
      AND COR_STATUT = 1
         )
 

Reply

Marsh Posté le 24-07-2003 à 14:40:54   

Reply

Marsh Posté le 24-07-2003 à 15:09:15    

liengy a écrit :

Tout est dans le sujet :


 
A mon avis mais c'est que mon avis ( en mssql , après tu adaptes)

Code :
  1. SELECT TOP 1 COR_ID_ZONE, COR_SOCIETE, COR_IDSERVICE, COR_CATEGORIE,
  2.       COR_DEBUT_DATE_EFFET, COR_VALEUR, COR_ID_OPERATEUR
  3. FROM CORRECTIF
  4. WHERE COR_DEBUT_DATE_EFFET < SYSDATE
  5.   AND COR_ID_ZONE = 9
  6.   AND COR_SOCIETE = '147'
  7.   AND COR_IDSERVICE = '1'
  8.   AND COR_CATEGORIE = 'F76'
  9.   AND COR_STATUT = 1
  10.   ORDER BY COR_DEBUT_DATE_EFFET DESC


Message édité par Lord II le 24-07-2003 à 15:09:38

---------------
La bave du crapaud n'empèche pas la caravane de passer .
Reply

Marsh Posté le 24-07-2003 à 15:35:13    

Lord II a écrit :


 
A mon avis mais c'est que mon avis ( en mssql , après tu adaptes)

Code :
  1. SELECT TOP 1 COR_ID_ZONE, COR_SOCIETE, COR_IDSERVICE, COR_CATEGORIE,
  2.       COR_DEBUT_DATE_EFFET, COR_VALEUR, COR_ID_OPERATEUR
  3. FROM CORRECTIF
  4. WHERE COR_DEBUT_DATE_EFFET < SYSDATE
  5.   AND COR_ID_ZONE = 9
  6.   AND COR_SOCIETE = '147'
  7.   AND COR_IDSERVICE = '1'
  8.   AND COR_CATEGORIE = 'F76'
  9.   AND COR_STATUT = 1
  10.   ORDER BY COR_DEBUT_DATE_EFFET DESC

 

Je ne connaissais pas le coup du "top 1"... C intéressant, mais ça n'a pas l'air de fonctionner en oracle...

Reply

Marsh Posté le 24-07-2003 à 15:46:17    

j'ai dit qu'il faudrait adapter. perso je ne peux t'aider mais tu dois pouvoir trouver ca dans la doc oracle


---------------
La bave du crapaud n'empèche pas la caravane de passer .
Reply

Marsh Posté le 24-07-2003 à 17:30:22    

avec oracle, c'est "where rownum < 1"
 
ou numrow, chais jamais :D

Reply

Marsh Posté le 24-07-2003 à 17:37:36    

MagicBuzz a écrit :

avec oracle, c'est "where rownum < 1"
 
ou numrow, chais jamais :D


rownum < 2  :o


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 24-07-2003 à 18:16:50    

Merci à vous 3....
 
et matière d'optimisation en temps, vous en pensez quoi entre les 2 ?????

Reply

Marsh Posté le 24-07-2003 à 19:20:39    

arf, oui, je voulais dire <= :D

Reply

Marsh Posté le 24-07-2003 à 20:02:46    

liengy a écrit :

Merci à vous 3....
 
et matière d'optimisation en temps, vous en pensez quoi entre les 2 ?????


 
ma version ne possède qu'une seule requete !!! :sol:


---------------
La bave du crapaud n'empèche pas la caravane de passer .
Reply

Marsh Posté le 25-07-2003 à 10:11:59    

Lord II a écrit :


 
ma version ne possède qu'une seule requete !!! :sol:  

Oui mais c une seule requête avec un tri + une sélection sur le 1° résultat...
 
Est-ce réellement plus rapide que la sélection d'un max, puis une requête triviale ???
 
Je suis d'accord sur l'optimisation d'écriture, et donc de compréhension... Mais en temsp d'exécution ?

Reply

Marsh Posté le 25-07-2003 à 10:11:59   

Reply

Marsh Posté le 25-07-2003 à 11:36:16    

liengy a écrit :

Oui mais c une seule requête avec un tri + une sélection sur le 1° résultat...
 
Est-ce réellement plus rapide que la sélection d'un max, puis une requête triviale ???
 
Je suis d'accord sur l'optimisation d'écriture, et donc de compréhension... Mais en temsp d'exécution ?


conserve ta requete de départ, car sous Oracle, le coup du top 1 ne marchera pas : en effet, lorsque tu utilise rownum, il l'utilise avant de faire le ORDER BY, donc ca marchera pas ! Et puis je trouve ça plus lisible en fait, mais c'est subjectif ...

Reply

Marsh Posté le 27-07-2003 à 23:29:27    

Suffit de faire le order dans la requête, puis une requête autour portant sur le rownum :)
 
Sinon, le problème du max, c'est qu'il oblige à faire une requête avec des regroupements, ce qui est très consomateur.

Reply

Marsh Posté le 11-08-2003 à 16:00:52    

Sinon, on peut faire la recherche du maximum dans une premiere requete en stockant le resultat dans un variable puis la seconde requete qui ne sert qu'a afficher le resultat.
 
L'interet est de ne pas avoir les 2 requetes en memoire au meme moment.
Ca optimise pas trop en soit, mais sa doit faciliter le travail de l'optimisateur d'oracle.

Reply

Marsh Posté le 11-08-2003 à 19:28:34    

toto666 a écrit :

Sinon, on peut faire la recherche du maximum dans une premiere requete en stockant le resultat dans un variable puis la seconde requete qui ne sert qu'a afficher le resultat.
 
L'interet est de ne pas avoir les 2 requetes en memoire au meme moment.
Ca optimise pas trop en soit, mais sa doit faciliter le travail de l'optimisateur d'oracle.


Au contraire, c'est plus lent (pas énormément, mais tout de même)

Reply

Sujets relatifs:

Leave a Replay

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