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 :

Optimisation requête [10g]


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 71
    Points : 49
    Points
    49
    Par défaut Optimisation requête
    Bonjour,

    J'ai une requête sur oracle qui me semble prendre énormément de temp pour donner un résultat ! j'aimerais trouver une solution pour l'optimiser :
    Comment je peux faire SVP ?!

    ci joint ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    with req as (
    select  num_compte ,montant,
    (select  sum(0-montant) from d_mouvement_par d where NATURE=3 and cod_evenement='IMM' and d.dte_operation between ret.dte_operation   and ret.dte_operation+31 and d.num_compte=ret.num_compte) as montant_retrait  
    from suivi_ret ret)
     
    select 
     
    case 
    when MONTANT >= 3000  and  montant_retrait  between 2000 and 3000 then 'cas1'
    when MONTANT >= 5000  and  montant_retrait  between 3000 and 4000 then 'cas2'
    when MONTANT >= 8000  and  montant_retrait  between 4000 and 4000 then 'cas3'
    when MONTANT >= 10000 and  montant_retrait  between 4000 and 5000 then 'cas4'
    when MONTANT >= 10000 and  montant_retrait  between 5000 and 6000 then 'cas5'
    when MONTANT >= 10000 and  montant_retrait  between 2000 and 3000 then 'cas6'
     end as cas
    ,count(*)  as nobmre_virement
     from req
    group by 
      case 
    when MONTANT >= 3000  and  montant_retrait  between 2000 and 3000 then 'cas1'
    when MONTANT >= 5000  and  montant_retrait  between 3000 and 4000 then 'cas2'
    when MONTANT >= 8000  and  montant_retrait  between 4000 and 4000 then 'cas3'
    when MONTANT >= 10000 and  montant_retrait  between 4000 and 5000 then 'cas4'
    when MONTANT >= 10000 and  montant_retrait  between 5000 and 6000 then 'cas5'
    when MONTANT >= 10000 and  montant_retrait  between 2000 and 3000 then 'cas6'
     end;
    merci pour votre aide

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Normalement, c'est cette requête qui rame vu que le reste c'est juste un groupement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  num_compte ,montant,
    (SELECT  SUM(0-montant) FROM d_mouvement_par d WHERE NATURE=3 AND cod_evenement='IMM' AND d.dte_operation BETWEEN ret.dte_operation   AND ret.dte_operation+31 
    			AND d.num_compte=ret.num_compte) AS montant_retrait  
    FROM suivi_ret ret
    Vérifie l'explain plan
    Vérifie que la table d_mouvement_par a bien un index sur num_compte et autres conditions
    Vérifie si en faisant une jointure externe (suivi_ret, d_mouvement_par) + group by n'est pas plus optimisé que le Sous select (Attention, mettre la clé de Suivi_ret sinon tu regrouperais des lignes de suivi_ret ayant le même num_compte, montant)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Tu as une première partie qui est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select  num_compte ,montant,
    (select  sum(0-montant) from d_mouvement_par d where NATURE=3 and cod_evenement='IMM' and d.dte_operation between ret.dte_operation   and ret.dte_operation+31 and d.num_compte=ret.num_compte) as montant_retrait  
    from suivi_ret ret
    Je n'aime pas du tout cette requête.
    Je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select ret.num_compte , ret.montant, -sum(d.mouvement) as montant_retrait 
    from  suivi_ret ret , d_mouvement_par d 
    where d.NATURE=3 and d.cod_evenement='IMM' and d.dte_operation between ret.dte_operation and ret.dte_operation+31 and d.num_compte=ret.num_compte 
    group by ret.num_compte , ret.montant
    Mais en fait, j'imagine que si le type qui a fait la requête n'a pas fait comme ça, c'est parce qu'il avait une bonne raison. Sauf erreur, ma proposition perd certaines données, elle perd les cas où pour une ligne de suivi_ret, on n'a aucun enregistrement correspondant dans d_mouvement.

    Tu confirmes que c'est ça ?
    Dans ce cas, il faut passer par des OUTER-JOIN ... mais j'ai un trou de mémoire, et je ne peux pas tester : peut-on gérer la commande Between dans un outer-Join.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Dans ce cas, il faut passer par des OUTER-JOIN ... mais j'ai un trou de mémoire, et je ne peux pas tester : peut-on gérer la commande Between dans un outer-Join.
    Si vous faites des jointures normalisées (depuis 1992, en utilisant l'opérateur JOIN) il n'y a aucune limite au prédicat de jointure. Vous pouvez même mettre une sous requête…

    A lire sur les jointures normalisées :
    https://sqlpro.developpez.com/cours/...ointures/#LIII

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Hello,
    et le plan d'exécution ?
    Des statistiques sur suivi_ret ? Des histogrammes ?
    Mode rule ou choose ?
    optimizer_index_cost_adj = 100 ?
    optimizer_features_enable ?

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

Discussions similaires

  1. optimisation requête-regroupement info
    Par mariobedard dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 15h10
  2. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  3. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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