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

PL/SQL Oracle Discussion :

Optimisation de requête


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Par défaut Optimisation de requête
    Bonjour,

    Je dois ré-écrire une requete un peu longuette... (704 lignes de pure bonheur)

    Dans cette requete j'ai 10 sous-requetes, ma question est la suivante, ne serait-il pas plus facile a maintenir si en place de chaque sous-requete je mettais une petite fonction retournant une table.

    Ou serait-il préférable de passer par des vues (lorsqu'elles ne sont pas paramétrées)?

    Idem, au niveau du select, j'ai des joli case énorme, donc ne vaut-il pas mieux les remplacer eux aussi??

    Merci pour vos conseils!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Et pourquoi pas utiliser une expression de table commune (Common Table Expression) ou plusieurs si nécessaire ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Je rajouterais, outre ce qu'à dit al_1 sur les CTE (les CTE, c'est la vie, n'oubliez jamais ça) qu'Oracle fonctionne mieux en curseur qu'en ensembliste (je l'ai revu il y a peu à mes dépends...) et que en fonction de comment ta/tes requêtes sont faites, parfois, les disséquer pour en sortir des curseur ?

    A voir comment le code est fait quoi, sans, on ne peut que faire des hypothéses (bon d'un côté, lire 700 lignes, ça vend pas forcement du rêve)

    Après, le mieux serait peut être aussi de dissequer/prendre les requêtes une a une, voir le plan d'exécution si y'en a une ou plusieurs qui ne sont pas opti...

    Bisous bisous

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Citation Envoyé par JeanYvette Voir le message
    Je rajouterais, outre ce qu'à dit al_1 sur les CTE (les CTE, c'est la vie, n'oubliez jamais ça) qu'Oracle fonctionne mieux en curseur qu'en ensembliste (je l'ai revu il y a peu à mes dépends...)
    Bisous bisous
    Bonjour,

    Tu as un exemple pour comparer parce que c'est le contraire en fait? Un curseur qui fait du ligne à ligne sera plus lent qu'une requête qui traite tout d'un coup.

  5. #5
    Membre confirmé
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Par défaut
    Merci pour vos réponses.

    Envoyé par JeanYvette

    Après, le mieux serait peut être aussi de dissequer/prendre les requêtes une a une, voir le plan d'exécution si y'en a une ou plusieurs qui ne sont pas opti...
    La je peux confirmer que c'est bien le cas, les sous-requetes en double, les 2 similaires mais sur des tables différentes, bon j'en passes...

    en exemple de sous-requete j'ai :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select ac.num_cpt "A", round(sum(balance)/max(valuation),2) "B"
     from  compte c,  propriete p
    where c.num_prop=p.num_prop
    and   c.type = 'M'
    and   c.period='31-dec-19'
    group by c.num_prop
    et je l'ai en double puisque j'ai besoin de la meme info pour le mois de novembre

    de plus, toute les tables utilisés dans la sous-requetes sont présentes dans la requete principale.

    Les sous-reauetes sont jointes par le numéro de compte a la requete principale.

    mon but est juste que quand je partirai, mon remplacant ne s'arrache pas les cheveux a essayer de comprendre ce que j'ai bien pu fabriquer!

    Voila, voilou!

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Citation Envoyé par Lagnio Voir le message
    de plus, toute les tables utilisés dans la sous-requetes sont présentes dans la requete principale.
    Les sous-reauetes sont jointes par le numéro de compte a la requete principale.
    Dans ce cas tu certainement mutualiser avec un bloc WITH, des CASE et des fonctions analytiques.

  7. #7
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Tu as un exemple pour comparer parce que c'est le contraire en fait? Un curseur qui fait du ligne à ligne sera plus lent qu'une requête qui traite tout d'un coup.
    Un exemple purement personnel. J'avais une requête assez importante, qui utilisez des CTE et des index. Elle était lente, mais lente... (Bon après je soupçonne aussi la base car la même requête mettait, en 30 minutes d'écart, 10 secondes une fois contre 380 une autres...)
    J'ai fait la même requête, en terme d'algo, en curseur, ca tourne super bien. Ca me sidère parce que je suis du même avis que toi, mais j'ai eu plusieurs cas qui se sont passés comme ça...

    Après, et c'est un fait, Oracle gère mieux les curseurs que d'autres SGBD...




    Sinon, pour en revenir au problème actuel. Une requête en double doit clairement être mise dans une CTE (la petite clause WITH, au cas où ce nom ne te parle pas)
    Ensuite, deux sous-requête similaires mais sur des tables différentes, bon beh tant pis j'ai envie de dire

  8. #8
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    Ce n'est pas parce qu'une requête est longue qu'elle est problématique. Pourquoi dois-tu la réécrire? Pose-t-elle des problèmes de perf?
    Pour commencer il faudrait que tu montres la requête en question.

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

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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