optimisation de requête.... [SQL] - SQL/NoSQL - Programmation
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 :
|
Marsh Posté le 24-07-2003 à 15:35:13
Lord II a écrit :
|
Je ne connaissais pas le coup du "top 1"... C intéressant, mais ça n'a pas l'air de fonctionner en oracle...
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
Marsh Posté le 24-07-2003 à 17:30:22
avec oracle, c'est "where rownum < 1"
ou numrow, chais jamais
Marsh Posté le 24-07-2003 à 17:37:36
MagicBuzz a écrit : avec oracle, c'est "where rownum < 1" |
rownum < 2
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 ?????
Marsh Posté le 24-07-2003 à 20:02:46
liengy a écrit : Merci à vous 3.... |
ma version ne possède qu'une seule requete !!!
Marsh Posté le 25-07-2003 à 10:11:59
Lord II 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 ?
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... |
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 ...
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.
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.
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. |
Au contraire, c'est plus lent (pas énormément, mais tout de même)
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
)