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

Oracle Discussion :

[Oracle 8.1.7] Choix d'une mauvaise stratégie


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [Oracle 8.1.7] Choix d'une mauvaise stratégie
    Bonjour,

    j'ai un problème de choix d'index par Oracle.

    Version Oracle : 8.1.7
    Serveur Unix Aix 5.1
    Methode : RULE


    Soit 2 tables
    CAREC ( 60'000'000 de lignes)
    ET GLFAC ( 6'000'000 de lignes)
    CAREC (
    CAREC_NUM NOT NULL NUMBER,
    CAREC_ORD NOT NULL NUMBER,
    GLFAC_REF NUMBER,
    CAINT_NUM NUMBER,
    ... )

    GLFAC
    (
    GLFAC_REF NOT NULL NUMBER,
    GLFAC_DTD NOT NULL DATE,
    GLFAC_DTF NOT NULL DATE,
    GLFAC_DATECH NOT NULL DATE,
    ...)
    Sur la table CAREC, on a plusieurs indexs dont 2 en particulier
    CARECI5 et CAREC_SPI9

    CREATE INDEX CARECI5 ON
    CAREC(CAINT_NUM, CAREC_STATUT, CAREC_DATREF)
    TABLESPACE CA_INDX PCTFREE 20
    STORAGE(INITIAL 104857600 NEXT 104857600 PCTINCREASE 0 ) ;

    CREATE INDEX ULISM.CAREC_SPI9 ON
    CAREC(CAINT_NUM,GLFAC_REF)
    TABLESPACE CA_INDX PCTFREE 10 INITRANS 2 MAXTRANS 255
    STORAGE ( INITIAL 200M NEXT 200M PCTINCREASE 0 ) ;
    La requete SQL
    select max(glfac.glfac_datech)
    from carec,glfac
    where carec.glfac_ref = glfac.glfac_ref
    and carec.caint_num = 123323
    and glfac.glfac_datech < '01/10/2005'
    and glfac.glfac_ref != 1223333
    and glfac.glfac_numfac is not null
    ;
    La requête doit normalement utilisé l'index CAREC_SPI9, mais force est de constater qu'en fonction de la date de création, ORACLE prend l'index le plus recent ( CARECI5 quand ce dernier est recréer ).

    Explain plan quand CARECI5 est l'index créer le plus recemment
    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE
    1 0 SORT (AGGREGATE)
    2 1 NESTED LOOPS
    3 2 TABLE ACCESS (BY INDEX ROWID) OF 'CAREC'
    4 3 INDEX (RANGE SCAN) OF 'CARECI5' (NON-UNIQUE)
    5 2 TABLE ACCESS (BY INDEX ROWID) OF 'GLFAC'
    6 5 INDEX (UNIQUE SCAN) OF 'GLFACP1' (UNIQUE)

    Explain plan quand CAREC_SPI9 est l'index créer le plus recemment
    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE
    1 0 SORT (AGGREGATE)
    2 1 NESTED LOOPS
    3 2 INDEX (RANGE SCAN) OF 'CAREC_SPI9' (NON-UNIQUE)
    4 2 TABLE ACCESS (BY INDEX ROWID) OF 'GLFAC'
    5 4 INDEX (UNIQUE SCAN) OF 'GLFACP1' (UNIQUE)

    Cette requête est utilisé dans un programme en PRO*C
    Lorsqu'elle utilise CAREC_SPI9, temps de traitement 4h
    Lorsqu'elle utilise CARECI5, temps de traitement 19h !!!

    Pourquoi le fait de re-créer un index modifie la stratégie d'Oracle ?
    Merci de votre aide.

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    avez vous essayé un hint ou un outlines ?

  3. #3
    Candidat au Club
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai forcé la requête à utiliser l'index CAREC_SPI9, mais la stratégie a été completement chamboulé ( Lecture de GLFAC par un autre index puis lecture de CAREC par CAREC_SPI9).

    Pour le outline, honnêtement je ne sais pas ce que sait ?

  4. #4
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Je te conseille la methode CBO au lieu de REGLE

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par mendosa
    Pour le outline, honnêtement je ne sais pas ce que sait ?
    cela permet de sauvegarder le plan d'exécution. Pratique quand tu veut appliquer le même plan dans toutes tes bases

    http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96524/c16sqlpl.htm#8546

    http://download-west.oracle.com/docs/cd/B10501_01/em.920/a86647/outlinem.htm#1001303

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par bouyao
    Je te conseille la methode CBO au lieu de REGLE
    +1 et il ne faut pas oublier de calculer les stats

    Attention, le CBO n'est pas supporté par tous les ERP

  7. #7
    Candidat au Club
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Pour le CBO, je pense pas que je puisse l'utiliser.
    La base de donnée est proprietaire (SOPRA) et ils recommandent vivement de rester en mode rule.

    Donc je ne peux pas faire de stats sur les tables. (pour le moment)

    Une solution consiste a recrer le bon index avant de lancer le traitement ( mensuel) mais cela ne m'explique pas le comportement d'Oracle, et si cela ne cache pas d'autres problemes car je constate des degradations sur un certain nombre de programme.

    Meci

  8. #8
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Le hint ne marchera pas.
    Car des qu'on utilise un hint (exception le hint RULE) oracle choisi le CBO.
    et comme il n'ya pas de stats, Orcale choisi un plan erroné.

  9. #9
    Candidat au Club
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Avez-vous d'autres pistes ?
    Ou connaissance de bugg Oracle sur ce point.

    Merci de votre aide

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    pas besoin d'autre piste, le problème vient du mode RULE, il faut jouer avec l'ordre des tables et/ou colonnes. Le mieux serait de demander à Sopra ce qui empêche d'utiliser le CBO et surtout d'optimiser leur traitement

  11. #11
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    il ne me sembla ps qu'il y ai de bug sur la 817, mais le mode rule fonctionne en suivant des régles , et parfois il peut " déconner " notamment lorsqu'il y a un index de crée

    C'est pour cela que le mode choose est profitable

  12. #12
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Points : 710
    Points
    710
    Billets dans le blog
    1
    Par défaut
    Bonjour,


    Citation Envoyé par bouyao
    Le hint ne marchera pas.
    Car des qu'on utilise un hint (exception le hint RULE) oracle choisi le CBO.
    et comme il n'ya pas de stats, Orcale choisi un plan erroné
    cela n' est pas toujours vrai, si dans init_ora est précisé le mode rule,
    oracle n' utilisera pas le mode cbo et les hints fonctionnent .
    j' en ai fait l' expérience avec le produit PLEIADES de sopra
    qui effectivement ne souhaite pas qu' on utilise le mode cbo
    pour la plupart de ses applicatifs .
    chez nous : oracle 8.1.7.4 sous AIX 5.2

    cdlt

  13. #13
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Metalink :
    Any hint, except RULE, causes CBO to be used.
    It is very important to note that a HINT cannot be 'turned off' by any parameter settings
    Note:35934.1

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 87
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par bouyao
    Metalink :
    Any hint, except RULE, causes CBO to be used.
    It is very important to note that a HINT cannot be 'turned off' by any parameter settings
    Note:35934.1
    Si aucune statistique n'est calculé alors ( en 8 et 9) on se retrouve en rule

    néenmoins il faut mieux passer en CBO car cela est en moyenne plus rapide, de plus on rappel quen 10g le mode RULE n'est plus supporté.

  15. #15
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    Oui, mais mendosa le précise bien, c'est une base progiciel propriétaire.

    Selon les cas, le support du produit peut être "dévalidé" si on change les paramètres obligatoires fixés par l'éditeur.

    C'est le cas chez Siebel, ou pour les bases des applis Sopra aussi...

    Sinon, pour ce qui concerne les hints, même en étant en mode rule et si on excepte le hint RULE, on passera toujours en CBO si le hint est syntaxiquement valable : (je prend une table toto1 avec comme colonnes Id et Texte)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    test@BROCANTE> alter session set optimizer_goal=RULE;
     
    Session modifiÚe.
     
    test@BROCANTE> set autotrace traceonly explain
    16:51:54 test@BROCANTE> select * from toto1;
     
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=RULE
       1    0   TABLE ACCESS (FULL) OF 'TOTO1'
    J'utilise bien le mode RULE là (pas de cardinalité, pas de cost...)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    test@BROCANTE> select /*+ full(id) */ * from toto1;
     
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=RULE (Cost=1 Card=2000 Bytes=1300
              00)
     
       1    0   TABLE ACCESS (FULL) OF 'TOTO1' (Cost=1 Card=2000 Bytes=130
              000)
    J'ai mis un hint, j'ai utilisé le mode CHOOSE automatiquement.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    test@BROCANTE> select /*+ full(rien) */ * from toto1;
     
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=RULE (Cost=1 Card=2000 Bytes=1300
              00)
     
       1    0   TABLE ACCESS (FULL) OF 'TOTO1' (Cost=1 Card=2000 Bytes=130
              000)
    Le hint ne porte pas sur une colonne existante, mais il est syntaxiquement correct. J'utilise donc bien le mode CHOOSE...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    test@BROCANTE> select /*+ full rien */ * from toto1;
     
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=RULE
       1    0   TABLE ACCESS (FULL) OF 'TOTO1'
    Je suis repassé sur le mode RULE défini pour ma session, le hint n'étant pas valide.

  16. #16
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Points : 710
    Points
    710
    Billets dans le blog
    1
    Par défaut
    en faisant aussi des essais, j' ai fait la même constatation.
    alors si les statistiques ne sont pas calculés, qu' on est en mode rule,
    et qu' on force l' utilisation d' un index par hint,
    (qui est bien utilisé )
    comment se comporte l' optimiseur ?
    ou cela veut-il dire que c' est une aberration de placer des hints
    dans des requêtes sur des tables pour lesquelles il n' y a pas de stats ?

    cdlt

  17. #17
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Citation Envoyé par ducho
    cela veut-il dire que c' est une aberration de placer des hints
    dans des requêtes sur des tables pour lesquelles il n' y a pas de stats ?
    OUI

  18. #18
    Candidat au Club
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci de vos précisions.

    Il est clair que le mode RULE est a proscrire.
    Mais sur cette base, nous ne pouvons pas, bien que mon DBA n'a cessé de le demander à SOPRA.

    Pour ce traitement, je vais donc soit
    - Recréer l'index ( index spécifque ) chaque mois
    ou
    - utiliser un outline.


    Merci de votre aide.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/05/2014, 17h36
  2. Réponses: 58
    Dernier message: 29/10/2010, 12h35
  3. [optimiseur] choix d'une très mauvaise startégie
    Par Fabien Celaia dans le forum Administration
    Réponses: 25
    Dernier message: 31/08/2004, 18h32
  4. Choix d'une base de données
    Par maurice66 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 15/07/2004, 10h14
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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