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 :

Performance d'une requête


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut Performance d'une requête
    salut à tous,

    Voilà j'ai une autre requête que je voudrais optimiser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Update tab1 set
    FLAG_CLIENT = w_client
    , FLAG_LIGNE = (select case when w_client > FLAG_LIGNE then w_client else FLAG_LIGNE end from dual)
    where status = 'NEW'
    and FLAG_EQUILIBRE = '0'
    and not exists ( select 'x' from tab2 where tab2.CLIENT = substr(LIGNE_ME,1,16))
    J'ai créé 2 indexes sur tab1 :

    - le premier avec (status ,FLAG_EQUILIBRE)
    - le second avec (substr(LIGNE_ME,1,16))

    et sur tab2 :
    - un index sur (CLIENT ).

    Qu'est ce que vous en pensez?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Pourquoi cette requête sur DUAL ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE tab1
       SET FLAG_CLIENT    = w_client
         , FLAG_LIGNE     = greatest(w_client, FLAG_LIGNE)
     WHERE STATUS         = 'NEW'
       AND FLAG_EQUILIBRE = '0'
       AND NOT EXISTS (SELECT NULL
                         FROM tab2
                        WHERE tab2.CLIENT = substr(LIGNE_ME, 1, 16));
    Quant aux index, ça peut améliorer, ça peut dégrader, ça peut ne rien changer.
    Ça dépend de vos données.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Merci pour le "greatest" je ne connaissais pas!!

    Sinon, la table tab1 et tab2 ont plus de 1 millions de lignes (tab1 varie de 200 000 jusqu'à 2,5 millions et la table tab2 ne varie pas trop 1,4 millions )

  4. #4
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    A ma connaissance il oracle utilise 1 index par table et par requête. Tu peux vérifier le plan d'exécution dans Toad.
    Mais à priori un index avec les 3 champs est peut être mieux, si oracle l'utilise.
    Par contre il ne vaut mieux pas mettre d'index sur FLAG_CLIENT et FLAG_LIGNE car je pense que ça serait pénalisant.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Comment je pourrais voir le plan d’exécution de la requête dans toad?

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Attention Waldar, ton code n'est pas identique, tu ne gères pas les NULL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH t AS (SELECT 10 AS flag_ligne FROM dual),
    w AS (SELECT 1 w_client FROM dual 
    UNION SELECT 20 FROM dual
    UNION SELECT NULL FROM dual)
    SELECT flag_ligne, w_client,
    	(SELECT CASE WHEN w_client > FLAG_LIGNE THEN w_client ELSE FLAG_LIGNE END FROM dual) res,
    	GREATEST(w_client, FLAG_LIGNE) great,
    	NVL(GREATEST(w_client, FLAG_LIGNE), FLAG_LIGNE) ok
    FROM t, w
     
    FLAG_LIGNE	W_CLIENT	RES	GREAT		OK
    10		1		10	10		10
    10		20		20	20		20
    10		(null)		10	(null)		10

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Merci, mais Les FLAG ne sont jamais à NULL, ni les Variables w_...

    Très bonne remaque sinon!!

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    Comment je pourrais voir le plan d’exécution de la requête dans toad?
    Dans Toad, c'est l'icône de l'ambulance. Tu surlignes ta requête et tu cliques sur l'ambulance (ou menu Database / Optimize / Explain Plan).

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Merci c'est bon j'ai trouvé comment la faire.

    Mais dans la requête j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    where substr(Ligne,1,1) <> 'G'
    et mon index est sur substr(Ligne,1,1), mais le problème c'est qu'il n'utilise pas l'index si dans le where j'ai '<>' au lieu de '='!!

    Y a t il moyen de faire autrement?

  10. #10
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    T'as combien de ligne avec G par rapport au nombre de lignes totales ? Parce que si tu ramènes beaucoup de lignes, c'est normal qu'Oracle n'utilise pas l'index, ce serait une perte de temps

    Sinon, pour mon info , un index normal ne suffirait-il pas puisque c'est la première lettre que tu cherches ?


    Citation Envoyé par AbouZaid Voir le message
    Mais dans la requête j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    where substr(Ligne,1,1) <> 'G'
    Et c'est confidentiel défense ou tu peux nous mettre la requête en entier ? Parce que ça on l'a pas dans ton post de départ

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    bonjour,

    et bien j'ai enormement de requêtes avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE substr(Ligne,1,1) <> 'G'
    Sinon pour le nombre de lignes, en général ce sont les 'G' qui dominent!

    Voici un des requêtes que je voudrais optimiser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Update Tab1 set
      FLAG_PCEC = w_CTRL_PCEC
    , FLAG_LIGNE = greatest( w_CTRL_PCEC, FLAG_LIGNE)
    where STATUS = 'NEW'
    and    substr(LIGNE_ME,1,1) <> 'G'
    and    PCEC IS null
    and    length(ltrim(rtrim(substr(LIGNE_ME,1,16)))) <> 7

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Une autre requête qui prend 5 min sur 2 millions de lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Update table set
       JOURNAL = 'JOURNAL_AUTRE'
    ,  FLAG_JOURNAL = w_CTRL_JOURNAL
    ,  FLAG_LIGNE = greatest(w_CTRL_JOURNAL,FLAG_LIGNE)
    where STATUS = 'NEW'
    and  JOURNAL = 'JOURNAL_0';
    sachant qu'il ya un index sur la table sur les colonnes ( STATUS, JOURNAL)!!!

  13. #13
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Faudrait une trace pour savoir où le temps passe

  14. #14
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    trace sur toad? sqlplus?

  15. #15
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    il serait interessant que vous postiez les plans d'execution de vos requetes, ainsi que le descriptif complet de vos indexes.

    Bon courage

  16. #16
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Si vous pouviez m'aider pour le faire.

    J'ai cherché et trouvé comment faire un plan d’exécution de ma requête, mais pourriez vous me dire quelles champs afficher de la table PLAN_TABLE?

  17. #17
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Merci de faire une recherche dans les tutos, tout y est expliqué

  18. #18
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Au moins les ordres de creation de vos indexes, cela permettra de comprendre un peu ce qui se passe... Le plan d'execution serait le top, car il permettra de verifier les differentes suppositions.

    Bon courage

  19. #19
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Voilà :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    SQL>  Update INTERFACE
      2  SET JOURNAL = 'CIH_AUTRE'
      3   where FLAG_JOURNAL <> '0'
      4      and STATUS ='TRANSFERED';
     
    817787 ligne(s) mise(s) à jour.
     
    Ecoulé : 00 :02 :39.97
     
    Plan d exécution
    ----------------------------------------------------------
       0      UPDATE STATEMENT Optimizer=ALL_ROWS (Cost=75582 Card=913097
              Bytes=21001231)
     
       1    0   UPDATE OF 'INTERFACE'
       2    1     TABLE ACCESS (FULL) OF 'INTERFACE' (TABLE) (Cost=
              75582 Card=913097 Bytes=21001231)
     
     
     
     
     
    Statistiques
    ----------------------------------------------------------
            187  recursive calls
        1343222  db block gets
        1369995  consistent gets
         786279  physical reads
      286278872  redo size
            371  bytes sent via SQL*Net to client
            387  bytes received via SQL*Net from client
              3  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
         817787  rows processed

  20. #20
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    et vous avez des indexes de créés ??

Discussions similaires

  1. [TSQL] Performance d'une requête "exists"
    Par dj_lil dans le forum Développement
    Réponses: 2
    Dernier message: 04/01/2008, 11h45
  2. Réponses: 8
    Dernier message: 21/09/2007, 14h51
  3. [MySQL 5]Performance d'une requêtes select
    Par SuperCed dans le forum Requêtes
    Réponses: 8
    Dernier message: 01/08/2006, 12h51
  4. [SQL2K] Problème anormal de performance d'une requète
    Par G. Goossens dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/03/2006, 12h06
  5. [SQL ] performances dans une requête
    Par claralavraie dans le forum Oracle
    Réponses: 12
    Dernier message: 05/01/2006, 17h54

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