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

DB2 Discussion :

EXPLAIN PLAN qui ne fonctionne pas


Sujet :

DB2

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut EXPLAIN PLAN qui ne fonctionne pas
    Bonjour,

    j'ai préféré ouvrir un nouveau post car il s'agit d'un EXPLAIN PLAN que je ne parviens pas faire marcher...

    Voici la sysin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SET CURRENT SQLID = 'OPC';            
      EXPLAIN PLAN SET QUERYNO = 99999 FOR
    SELECT *                                                 
         FROM CFVTP                                               
         ORDER BY XAX,BTP,JKP,BDF,             
                  NHY,LPM,HDT,NHP             
         FOR FETCH ONLY ;
    j'ai l'erreur suivante :

    SQLERROR ON EXPLAIN COMMAND, PREPARE FUNCTION
    RESULT OF SQL STATEMENT:
    DSNT408I SQLCODE = -204, ERROR: OPC.CFVTP IS AN UNDEFINED NAME
    DSNT418I SQLSTATE = 42704 SQLSTATE RETURN CODE
    DSNT415I SQLERRP = DSNXOTL SQL PROCEDURE DETECTING ERROR
    DSNT416I SQLERRD = -500 0 0 -1 0 0 SQL DIAGNOSTIC INFORMATION
    DSNT416I SQLERRD = X'FFFFFE0C' X'00000000' X'00000000' X'FFFFFFFF' X'000
    INFORMATION

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DSNT408I SQLCODE = -204, ERROR: OPC.CFVTP IS AN UNDEFINED NAME
    la réponse se trouve ici => mauvaise syntaxe, droit, ...

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    J'ai réussi à le faire passer en retirant le SET CURRENT SQLID = 'OPC';

  4. #4
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    C'est pas une erreur de syntaxe ... C'est juste que comme le nom de la table dans l'instructuin EXPLAIN n'était pas qualifié, DB2 a pris le SQLID courant pour former un nom complet qui, manifestement, n'est pas le bon ...

    Edit :
    Et donc, qu'est-ce qui donne ton EXPLAiN ?

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Justement, j'y arrive.

    J'ai utiliser le JCL suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //SELECTA  EXEC PGM=IKJEFT01,REGION=4M                                
    //SYSTSPRT DD  SYSOUT=*                                               
    //SYSPRINT DD  *                                              
    //SYSUDUMP DD  SYSOUT=*                                               
    //SYSTSIN  DD  *                                                      
     DSN SYSTEM(DBR2)                                                     
       RUN PROGRAM(DSNTEP2) PLAN(DSNTEP2)                                 
     END                                                                  
    //SYSIN    DD *                                                       
         SELECT * FROM OPC.PLAN_TABLE WHERE QUERYNO = 99999;
    le souci c'est la sysprint est illisible..

    Je sais qu'il y a un programme qui permet d'obtenir un résultat sur une seule ligne, ce qui est beaucoup plus lisible... mais je ne me souvient plus lequel...

  6. #6
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par sam01 Voir le message
    ... le souci c'est la sysprint est illisible..
    Passe la requête de lecture de ta PLAN TABLE en interactif sous ISPF et avec SPUFI. Le résultat est affiché sur une seule ligne ... Bon, faudra un peu jongler avec les F10 / F11 mais ça reste lisible ...

  7. #7
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Je ne peux pas en interactif, je n'ai pas les autorisations... Je suis obligé de passer par OPC...

  8. #8
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par sam01 Voir le message
    Je ne peux pas en interactif, je n'ai pas les autorisations... Je suis obligé de passer par OPC...
    Décidemment pas facile de faire de la perf sur ton site ...

  9. #9
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Tu ne crois pas si bien dire....

    Dès que je retrouve ce programme je reviens vers vous.

  10. #10
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    En général, j'utilise une requête sql écrite pour:
    1. selectionner les quelques colonnes utiles. Cette sélection dépend de ce que je cherche
    2. formater ces colonnes. Par ex: certaines colonnes sont en char(1) et le nom fait 10c, ==> 10c dans le listing.

    Ou alors, il faut utiliser Platinum (ou RC-Query, c'est la même chose), ou Mainview for Db2 ou ... Mais sans autorisation sur la plan_table c'est impossible. A moins de se créer sa plan_table perso, mais là il faut gérer.

  11. #11
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Salut bernard59139, j'ai l'autorisation sur Platinum de la PLAN_TABLE mais j'ai ce message quand je veux browse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    RUPM r14.5  ------------- RC/Update Main Menu ------------ 09/20/2011 10:27:59 
    COMMAND ===>                                                                   
    RU091E You are not authorized for the application you requested.               
    Option      => B                     Object  => T           Mode  => O ONLINE  
    Item Name   => PLAN_TABLE          > Creator => EXPLAIN   > Where => Y
    Pourtant mon groupe RACF est autoriser sur cette PLAN_TABLE...

    Y-a-t'il une autre autorisation à avoir ?

  12. #12
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Bon alors tant pis j'ai fait un select classique par batch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT PLANNO,APPLNAME,METHOD,TNAME,ACCESSTYPE,MATCHCOLS,               
    ACCESSNAME,INDEXONLY,PREFETCH                                           
    FROM OPC.PLAN_TABLE                                                     
    WHERE QUERYNO = 99999                                                   
    ORDER BY PLANNO
    Voici le résultat :

    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
     
     
    +----------------------------------- 
    !  PLANNO   ! APPLNAME !  METHOD   ! 
    +----------------------------------- 
    !         1 !          !         0 ! 
    +----------------------------------- 
     
    ----------------------------------------------------------------
    !                                                          TNAME
    ----------------------------------------------------------------
    ! TBCNT                                                         
    ----------------------------------------------------------------
     
    --------------------------
    ! ACCESSTYPE ! MATCHCOLS !
    --------------------------
    ! I          !         0 !
    --------------------------
     
    -----------------------------------------------------------------------
    !                                                        ACCESSNAME    
    -----------------------------------------------------------------------
    ! IXBANC                                                               
    -----------------------------------------------------------------------
     
    -----------------------+    
    ! INDEXONLY ! PREFETCH !    
    -----------------------+    
    ! N         ! S        !    
    -----------------------+

  13. #13
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    RU091E You are NOT authorized FOR the application you requested
    danss platinum, tu as des applications (des groupes de programmes).
    il faut être autorisé pout utiliser chacune de ces applications

  14. #14
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Mais alors comment connaître le nom de ce programme ou de ce plan afin que je puisse faire une demande d'autorisation.

    Il faut autoriser sur un plan, une table un package ?

  15. #15
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Le nom de l'application devrait être écrit qque part.
    si je me souviens bien, ca correspond à un plan dans db2,
    Normalement, ton admin devrais savoir.

  16. #16
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par sam01 Voir le message
    ... Voici le résultat :
    Donc c'est bien un accès via l'index :
    ACCESSTYPE = I

    sans utilisation de l'aborescence :
    MATCHCOLS = 0

    c'est ce qu'on appelle un " NON MATCHING INDEX SCAN "

    La bonne nouvelle c'est qu'on a :
    PREFETCH = S
    ce qui est plutôt favorable ...

    Questions :

    1) est-ce que l'index IXBANC est l'index CLUSTER sur la table ?

    2) en plus de la PLAN_TABLE est-ce que tu as une DSN_STATEMNT_TABLE ?

  17. #17
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Tu scannes l'index en faisant du séquential prefetch. Dont acte. Malheureusement, tu n'es pas en Indexonly. Cela signifie que tu vas scanner l'index et pour chaque ligne de l'index, DB2 te renverra également sur les datas. Ca donne un double scan. En général, ce n'est pas génial, il est préférable de scanner directement la table, DB2 se chargeant de faire ensuite un tri des lignes résultantes, plutôt que de profiter de l'index pour faire le tri. Evidemment, il y a des exceptions ou le tri par l'index est meilleur, DB2 n'étant pas un long fleuve tranquille.

    Concernant la PLAN_TABLE, voici le SELECT que je réalise après un EXPLAIN, sachant que j'édite le résultat grâce à un petit easytrieve, ce qui me permet d'avoir un résultat lisible et simple à analyser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT CAST(PROGNAME AS CHAR(8)), QUERYNO, QBLOCKNO, PLANNO,            
    SUBSTR(DIGITS(MIXOPSEQ),3,3), '    ', SUBSTR(DIGITS(METHOD),3,3),       
    CAST(TNAME AS CHAR(18)), ACCESSTYPE, SUBSTR(DIGITS(MATCHCOLS),3,3),     
    CAST(ACCESSNAME AS CHAR(18)), INDEXONLY, SORTN_UNIQ, SORTN_JOIN,        
    SORTN_ORDERBY, SORTN_GROUPBY, SORTC_UNIQ, SORTC_JOIN, SORTC_ORDERBY,    
    SORTC_GROUPBY, TSLOCKMODE, PREFETCH, SUBSTR(DIGITS(TABNO),3,3),         
    COLUMN_FN_EVAL, SUBSTR(DIGITS(ACCESS_DEGREE),3,3),                      
    SUBSTR(DIGITS(ACCESS_PGROUP_ID),3,3), SUBSTR(DIGITS(JOIN_DEGREE),3,3),  
    SUBSTR(DIGITS(JOIN_PGROUP_ID),3,3), SUBSTR(DIGITS(SORTC_PGROUP_ID),3,3),
    SUBSTR(DIGITS(SORTN_PGROUP_ID),3,3), PARALLELISM_MODE,                  
    SUBSTR(DIGITS(MERGE_JOIN_COLS),3,3), PAGE_RANGE, JOIN_TYPE,             
    WHEN_OPTIMIZE, QBLOCK_TYPE, TIMESTAMP, PARENT_QBLOCKNO,                 
    CHAR(COALESCE(TABLE_TYPE, ' '), 1)

  18. #18
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par Luc Orient Voir le message

    1) est-ce que l'index IXBANC est l'index CLUSTER sur la table ?

    2) en plus de la PLAN_TABLE est-ce que tu as une DSN_STATEMNT_TABLE ?
    Je pense qu'il est cluster voici les détails

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CLUSTERED: Y   
    CLUSTER% : 100 
    SPACE    : 0K
    il y a une table DSN_STATEMNT_TABLE.

  19. #19
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par pdz74 Voir le message
    Tu scannes l'index en faisant du séquential prefetch. Dont acte. Malheureusement, tu n'es pas en Indexonly. Cela signifie que tu vas scanner l'index et pour chaque ligne de l'index, DB2 te renverra également sur les datas. Ca donne un double scan. En général, ce n'est pas génial, il est préférable de scanner directement la table, DB2 se chargeant de faire ensuite un tri des lignes résultantes, plutôt que de profiter de l'index pour faire le tri. Evidemment, il y a des exceptions ou le tri par l'index est meilleur, DB2 n'étant pas un long fleuve tranquille.

    Concernant la PLAN_TABLE, voici le SELECT que je réalise après un EXPLAIN, sachant que j'édite le résultat grâce à un petit easytrieve, ce qui me permet d'avoir un résultat lisible et simple à analyser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT CAST(PROGNAME AS CHAR(8)), QUERYNO, QBLOCKNO, PLANNO,            
    SUBSTR(DIGITS(MIXOPSEQ),3,3), '    ', SUBSTR(DIGITS(METHOD),3,3),       
    CAST(TNAME AS CHAR(18)), ACCESSTYPE, SUBSTR(DIGITS(MATCHCOLS),3,3),     
    CAST(ACCESSNAME AS CHAR(18)), INDEXONLY, SORTN_UNIQ, SORTN_JOIN,        
    SORTN_ORDERBY, SORTN_GROUPBY, SORTC_UNIQ, SORTC_JOIN, SORTC_ORDERBY,    
    SORTC_GROUPBY, TSLOCKMODE, PREFETCH, SUBSTR(DIGITS(TABNO),3,3),         
    COLUMN_FN_EVAL, SUBSTR(DIGITS(ACCESS_DEGREE),3,3),                      
    SUBSTR(DIGITS(ACCESS_PGROUP_ID),3,3), SUBSTR(DIGITS(JOIN_DEGREE),3,3),  
    SUBSTR(DIGITS(JOIN_PGROUP_ID),3,3), SUBSTR(DIGITS(SORTC_PGROUP_ID),3,3),
    SUBSTR(DIGITS(SORTN_PGROUP_ID),3,3), PARALLELISM_MODE,                  
    SUBSTR(DIGITS(MERGE_JOIN_COLS),3,3), PAGE_RANGE, JOIN_TYPE,             
    WHEN_OPTIMIZE, QBLOCK_TYPE, TIMESTAMP, PARENT_QBLOCKNO,                 
    CHAR(COALESCE(TABLE_TYPE, ' '), 1)
    Bonjour pdz74, il n'y a pas de clause WHERE dans ton select ?

    Et qu'est-ce que easytrieve ?

    Qu'appelle-tu scanner directement la table ?

  20. #20
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Pas de clause Where : normal, je n'ai fourni que les expressions sélectionnées. Tu es libre de ne cibler que les lignes qui t'intéressent avec le queryno en particulier.

    Easytrieve est un petit langage de programmation qui permet de faire de manière extrêmement simple des éditions, des lectures de fichiers, ... Sur Zos, tu écrits en 10 lignes ce qui t'en prendrait 200 en cobol et tu n'as même pas besoin de compilation, tu peux exécuter directement le source. Malheureusement, si tu n'as pas ce langage dans ta société, c'est rapé.

    Quant à un scan de table, c'est tout simplement le fait de lire toutes les lignes d'une table sans passer par aucun index. 99% du temps, DB2 fait du séquentiel prefetch, cad qu'il anticipe les lectures avant même que tu les demandes. De plus, ce qui coute cher avec DB2, ce sont les I/O disques. Quand tu scannes une table complète, DB2 ramène la 1ère page et renvoie bien sur toutes les lignes de cette page. Donc, avec une I/O, DB2 peut ramener 100 lignes par exemple. Puis DB2 passe à la page suivante...

    Quitte à lire toutes les lignes d'une table, il est bien préférable de faire un bon scan de table une bonne fois pour toute, plutôt que de lire les lignes 1 par 1 au fur et à mesure des besoins. Les accès directs, dans un contexte batch, c'est la mort coté performances.

    A ta disposition.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08
  2. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. CREATEFILEMAPPING qui ne fonctionne pas???
    Par Jasmine dans le forum MFC
    Réponses: 2
    Dernier message: 06/01/2004, 19h33
  5. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04

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