Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/09/2011, 16h08   #1
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
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 :
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.
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 17h30   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 641
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 641
Points : 2 634
Points : 2 634
Salut,

Code :
1
2
 
DSNT408I SQLCODE = -204, ERROR: OPC.CFVTP IS AN UNDEFINED NAME
la réponse se trouve ici => mauvaise syntaxe, droit, ...
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 17h35   #3
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
J'ai réussi à le faire passer en retirant le SET CURRENT SQLID = 'OPC';
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 17h47   #4
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
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 ?
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 18h03   #5
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
Justement, j'y arrive.

J'ai utiliser le JCL suivant

Code :
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...
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 18h13   #6
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
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 ...
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 21h37   #7
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
Je ne peux pas en interactif, je n'ai pas les autorisations... Je suis obligé de passer par OPC...
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 22h34   #8
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
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 ...
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 06h43   #9
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
Tu ne crois pas si bien dire....

Dès que je retrouve ce programme je reviens vers vous.
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 07h22   #10
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 503
Détails du profil
Informations personnelles :
Localisation : France

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

Informations forums :
Inscription : octobre 2006
Messages : 503
Points : 688
Points : 688
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.
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 10h35   #11
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
Salut bernard59139, j'ai l'autorisation sur Platinum de la PLAN_TABLE mais j'ai ce message quand je veux browse :

Code :
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 ?
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 10h53   #12
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
Bon alors tant pis j'ai fait un select classique par batch :

Code :
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 :
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        !    
-----------------------+
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 11h18   #13
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 503
Détails du profil
Informations personnelles :
Localisation : France

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

Informations forums :
Inscription : octobre 2006
Messages : 503
Points : 688
Points : 688
Citation:
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
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 11h25   #14
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
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 ?
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 11h41   #15
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 503
Détails du profil
Informations personnelles :
Localisation : France

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

Informations forums :
Inscription : octobre 2006
Messages : 503
Points : 688
Points : 688
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.
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 12h32   #16
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
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 ?
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 13h31   #17
Membre actif
 
Inscription : juin 2008
Messages : 146
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : juin 2008
Messages : 146
Points : 183
Points : 183
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 :
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)
pdz74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 14h41   #18
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
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 :
1
2
3
4
 
CLUSTERED: Y   
CLUSTER% : 100 
SPACE    : 0K
il y a une table DSN_STATEMNT_TABLE.
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 14h44   #19
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
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 :
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 ?
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 15h40   #20
Membre actif
 
Inscription : juin 2008
Messages : 146
Détails du profil
Informations personnelles :
Âge : 44

Informations forums :
Inscription : juin 2008
Messages : 146
Points : 183
Points : 183
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.
pdz74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h21.


 
 
 
 
Partenaires

Hébergement Web