IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Requête trés couteuse en temps


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 86
    Par défaut Requête trés couteuse en temps
    Bonjour, j'ai une requête très couteuse en temps, et je sollicite votre aide pour la rendre plus simple si possible. Je suis pas très bon jointure.
    Sachant que j'ai déjà mis en place des index et fait un dbms-stat sur la base.

    Les index existants sont:
    - HISTORIQUE.HIS_AFFAIRE_W4_ID
    - COMMENTAIRE.HIS_ID
    - La table COMMENTAIRE possède une clé étrangère sur HISTORIQUE.HIS_ID.
    - HISTORIQUE.HIS_ID est la clé primaire de HISTORIQUE

    Voici la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT  HISTORIQUE.HIS_ID, HISTORIQUE.ACT_ID, HISTORIQUE.HIS_ACTION, ....., COMMENTAIRE.COM_ORDRE, COMMENTAIRE.COM_TEXTE, COMMENTAIRE.HIS_ID 
    FROM HISTORIQUE  
    INNER JOIN 
      (SELECT MAX(HISTORIQUE.HIS_ID) ID_MAX FROM HISTORIQUE WHERE HISTORIQUE.HIS_AFFAIRE_W4_ID IN ('40653','88954','103077','38286',....) OR HISTORIQUE.HIS_AFFAIRE_W4_ID IN ('37768','83857','36898','39025','70083','39788','62566','36752','30372',...) GROUP BY HIS_AFFAIRE_W4_ID) 
    DERNIER_COMMENTAIRE ON HISTORIQUE.HIS_ID=DERNIER_COMMENTAIRE.ID_MAX 
     
      LEFT OUTER JOIN COMMENTAIRE ON COMMENTAIRE.HIS_ID=HISTORIQUE.HIS_ID WHERE HISTORIQUE.HIS_AFFAIRE_W4_ID IN ('40653','88954','103077','38286',...) OR HISTORIQUE.HIS_AFFAIRE_W4_ID IN ('37768','83857','36898','39025','70083','39788','62566','36752',...);
    Désolé pour la lisibilité, mais je ne peux guère faire mieux.

    D'avance merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut
    Tu es sur quelle version de la base?
    Une idée de la volumétrie des tables et indexes?

    Pourquoi tu fais ces OR?
    Tu as beaucoup de valeurs dans tes IN?

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 86
    Par défaut
    Tu es sur quelle version de la base? => oracle 9.0i
    Une idée de la volumétrie des tables et indexes? environ 50.000

    Pourquoi tu fais ces OR? car une clause in ne peut contenir que 1000 éléments
    Tu as beaucoup de valeurs dans tes IN? => pas plus de 1000

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut
    Vu le nombre de valeurs que tu mets dans ton IN, il serait surprenant qu'Oracle emploie ton indexe HISTORIQUE.HIS_AFFAIRE_W4_ID. Peux-tu nous dire quel est le plan d'exécution?

    Je pense qu'il serait mieux de mettre toutes tes valeurs voulues de HIS_AFFAIRE_W4_ID dans une table et de faire un where exists avec cette table par exemple.

    Tu n'as plus besoin non plus de mettre les conditions sur le IN dans le left outer join vu que HIS_ID est pk de HISTORIQUE et que tu le fixes avec ton query qui fait le max.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 86
    Par défaut
    Je dois partir, on voit ça lundi. Mais merci déjà pour ces premières réponses.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 86
    Par défaut
    Je reviens sur mon message par hasard, mais ce problème a été résolu en supprimant cette requête et en faisant le travail avec des requêtes plus petites et un traitement java. Le gain de temps n'est pas forcément là, mais le besoin client s'est aussi allégé.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation d'une requête très lourde
    Par Benji76 dans le forum Requêtes
    Réponses: 9
    Dernier message: 24/02/2007, 11h35
  2. v.2003- Requête très spéciale..
    Par guyCnet dans le forum Access
    Réponses: 4
    Dernier message: 04/12/2006, 09h25
  3. Plusieurs requêtes INSERT en même temps
    Par jeyce dans le forum JDBC
    Réponses: 3
    Dernier message: 06/11/2006, 09h42
  4. Requête pour calculer le temps entre deux dates
    Par Badboy62cfp dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2006, 13h50
  5. Réponses: 4
    Dernier message: 09/12/2005, 08h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo