Avancées (principalement DB2) apportées via PTF en versions 6 et 7
Extrait des avancées signalées par le site IBM i Technology Updates(en plus du CONNECT BY et des améliorations OmniFind, présentés séparement)
Comme avec SNDSMTPEMM, il n'y a pas d'aide associé (à ce jour)
Comme avec RUNSQLSTM, la plupart des ordres SQL peuvent être utilisés, sauf SELECT
Contrairement à RUNSQLSTM, il n'y a pas :
Exemples d'utilisation donnés par la documentation
RUNSQL SQL('INSERT INTO prodLib/worktable VALUES(1, CURRENT TIMESTAMP)')
RUNSQL SQL('CREATE TABLE qtemp.worktable AS
(SELECT * FROM qsys2.systables WHERE table_schema = ''MYSCHEMA'') WITH DATA')
COMMIT(*NONE) NAMING(*SQL)
Vous pouvez ensuite lire WORKTABLE par RCVF
Enfin la commande SQL peut être une variable :
DCL &LIB TYPE(*CHAR) LEN(10)
DCL &SQLSTMT TYPE(*CHAR) LEN(1000)
CHGVAR VAR(&SQLSTMT) VALUE('DELETE FROM qtemp.worktable +
WHERE table_schema = ''' *cat &LIB *cat ''')
RUNSQL SQL(&SQLSTMT) COMMIT(*NONE) NAMING(*SQL)
Sur la liste des tables, demander à choisir les colonnes par F12
et vous pourrez faire apparaître 4 nouvelles colonnes
- nombre de total de lignes
- nombre de lignes supprimées
- nombre de membres
- taille globale
Gestion de l'utilisation de fonctions
Indiquez vos options, puis appuyez sur ENTREE.
2=Modifier l'utilisation 5=Utilisation
Opt ID fonction Nom de la fonction
_ QIBM_DIRSRV_ADMIN IBM Tivoli Directory Server Administrator
_ QIBM_ACCESS_ALLOBJ_JOBLOG Accès à l'historique de travail du travai
_ QIBM_ALLOBJ_TRACE_ANY_USER Trace any user
_ QIBM_WATCH_ANY_JOB Watch any job
_ -> QIBM_DB_SQLADM Administrateur de base de données
_ -> QIBM_DB_SYSMON Informations de base de donnéesLe premier fournit l'accès aux options d'administration de la base, le deuxième un accès restreint en consultation.
Voyez les tableaux suivants pour plus de détail
La même commande (WRKFCNUSG) affiche deux lignes supplémentaires au niveau 13
- WRKFCNUSG et les fonctions QIBM_DB_ZDA et QIBM_DB_DDMDRDA
Gestion de l'utilisation de fonctions
Indiquez vos options, puis appuyez sur ENTREE.
2=Modifier l'utilisation 5=Utilisation
Opt ID fonction Nom de la fonction
_ QIBM_DIRSRV_ADMIN IBM Tivoli Directory Server Administrator
_ QIBM_ACCESS_ALLOBJ_JOBLOG Accès à l'historique de travail du travai
_ QIBM_ALLOBJ_TRACE_ANY_USER Trace any user
_ QIBM_WATCH_ANY_JOB Watch any job _ -> QIBM_DB_DDMDRDA DDM & DRDA APPLICATION SERVER ACCESS
_ QIBM_DB_SQLADM Administrateur de base de données
_ QIBM_DB_SYSMON Informations de base de données
_ -> QIBM_DB_ZDA TOOLBOX APPLICATION SERVER ACCESSPermettant d'autoriser ou de refuser l'utilisaiton :
- QIBM_DB_ZDA
-> ODBC et JDBC (depuis l'IBM i), RUNSQL, RUNSQLSTM, et les options base de données de System i Navigator et Navigator Director
- QIBM_DB_DDMDRDA
-> DDM et DRDA (CONNECT TO)
- pour DRDA, par serveur
ADDSRVAUTE USRPRF(profil_local) SERVER(autre_serveur) USRID(profil_remote) PASSWORD(motdepasse)
- pour DDM avec QDDMSERVER
ADDSRVAUTE USRPRF(profil_local) SERVER(QDDMSERVER) USRID(profil_remote) PASSWORD(motdepasse)
- Vous pouvez maintenant (SF99601 level 21 et SF99701 level 11) faire une entrée générique par
ADDSRVAUTE USRPRF(profil_local) SERVER(QDDMDRDASERVER) USRID(profil_remote) PASSWORD(motdepasse)
- ET (SF99601 level 28 et SF99701 level 14) faire une entrée pour un profil de groupe
La règle de recherche est la suivante :
- recherche pour le profil et l'application
- recherche pour le profil et QDDMDRDASERVER
- recherche pour le groupe et l'application
- recherche pour le groupe et QDDMDRDASERVER
- recherche pour le groupe supplémentaire et l'application
- recherche pour le groupe supplémentaire et QDDMDRDASERVER
- demande d'une authentification !
- en SF99701 level 29, si vous créez une variable d'environnement (ADDENVVAR) QIBM_DDMDRDA_SVRNAM_PRIORITY, l'ordre devient
- recherche pour le profil et l'application
- recherche pour le groupe et l'application
- recherche pour le groupe supplémentaire et l'application
- recherche pour le profil et QDDMDRDASERVER
- recherche pour le groupe et QDDMDRDASERVER
- recherche pour le groupe supplémentaire et QDDMDRDASERVER
- demande d'une authentification !
Select * From TABLE (
Display_Journal(
-- bib et journal
'BDVIN1', 'QSQJRN',
-- bib et récepteur
' ', ' ',
-- timestampt de début ou null
now() - 7 days ,
-- séquence de début ou null
CAST(null as DECIMAL(21 , 0)),
-- code journal
' ',
-- type d'entrée
' ',
-- bib, objet, type, membre
' ' , ' ', ' ' , ' ',
-- profil utilisateur
'QPGMR',
-- job
' ',
-- pgm
' ' ) ) AS jrn
La colonne contenant les données du poste (ENTRY_DATA) est retournée sous forme de BLOB,
castez par CAST(ENTRY_DATA AS CHAR(2000)) pour la voir en clair.
select * from table (qsys2.OBJECT_STATISTICS('BDVIN1','JRN') ) as x donne la liste des journaux de BDVIN1
select * from table (qsys2.OBJECT_STATISTICS('BDVIN1','JRN JRNRCV') ) as x donne la liste des journaux et des récepteurs de BDVIN1
• Quand vous créez une procédure cataloguée elle est enregistrée dans SYSPROCS et SYSPARMS
Il existe un mécanisme qui l'enregistre à nouveau dans le catalogue système lors d'un RSTOBJ
Ce mécanisme de mise à jour du catalogue est désormais aussi assuré lors de l'utilisation des commandes :
- CRTDUPOBJ
- CPYLIB
- RNMOBJ
- MOVOBJ
simplifiant le passage en production des objets.
Si vous avez une variable d'environnement QIBM_SQL_NO_CATALOG_UPDATE, RNMOBJ et MOVOBJ, fonctionnent comme avant
• Le même niveau de correctif (19) permet de définir une valeur par défaut pour un paramètre de procédure
CREATE OR REPLACE PROCEDURE Creation_client(IN NOCLI DEC( 6, 0),IN DEPCLI CHAR(3) DEFAULT('44'),IN DATCLI DATE DEFAULT CURRENT DATE)LANGUAGE SQLBEGIN/* corps de la procédure */END;
L'appel peut se faire ensuite sous la forme
CALL Creation_client('123456')
CALL Creation_client('123456', '22')
CALL Creation_client('123456', '22', DEFAULT)
Les paramètres peuvent être nommés, afin d'éviter de renseigner un paramètre précédent par exemple
CALL Creation_client('123456', DATCLI=>'2013-01-17')
La valeur par défaut peut même être "dynamique"IN DEPCLI CHAR(3) DEFAULT
(SELECT depNum FROM departements WHERE deptNom='Morbihan')
et le paramètre FTRCLTPGM de STRDBMON admet le filtre 'RUNQRY' et 'STRQMQRY'
SI46394 place, en cas de "embeded SQL", dans :
• la PTF SF99701 level 18 propose deux nouvelles colonnes lors de l'affichage des instructions d'un moniteur de performance
Il faut cliquez sur "Colonnes"
et choisir ces deux colonnes
qui affichent
Si on lance Visual Explain, auquel on demande les suggestions proposées
Vous pouvez retrouver le source de ces procédures via System i Navigator (elles sont livrées "tel que") et les personnaliser.
ET le level 13 (SF99601 level 24 en V6) en propose une autre :
QSYS2.Reset_Table_Index_Statistics
Paramètres
1) Schema - varchar(128)Nom de la bibliothèque
2) Table - varchar(128)
Nom de la table ou du fichier physique
Ces deux paramètres sont sensibles à la casse et acceptent les caractères '_' et '%' (comme un LIKE)
Les compteur remis à zéro, sont ceux affichés ici
- Last query use
Date de dernière utilisation de cet index pour accéder à la table- Last query statistic use
Date de dernière utilisation de cet index pour collecter des statistiques
- Query use count
Nombre d'utilisations de cet index pour accéder à la table- Query statistic use
Nombre d'utilisations de cet index pour collecter des statistiques
La procédure remet à zéro Query use count et Query statistic use mais n'impacte pas Last query use, ni Last query statistic use.
Mais aussi, nous avons maintenant (SF99701, level 18) des statistiques d'Entrée/Sortie globales (si la notion de collecte est démarrée)
Avec Navigator Director :
Entrée/sortie base de donnée physiques, vue détaillée
Par travail :
Par sous-système
Par type de serveur
• la PTF SI46631 implémente une nouvelle fonction XMLTABLE produisant un contenu SQL à partir d'un flux XML
Exemple, Soit la table CUSTOMER
CREATE SCHEMA POSAMPLE; |
Avec les données suivantes
INSERT INTO Customer (Cid, Info) VALUES (1000, |
SELECT X.NOM, X.RUE, X.VILLE FROM Customer, XMLTABLE ('$c/customerinfo' passing INFO as "c" COLUMNS NOM CHAR(30) PATH 'name', RUE VARCHAR(25) PATH 'addr/street', VILLE VARCHAR(25) PATH 'addr/city' ) AS X Affiche ....+....1....+....2....+....3....+....4....+....5....+....6....+....7
NOM RUE VILLE
Kathy Smith 5 Rosewood Toronto
Jim Noodle 1150 Maple Drive Newtown
Robert Shoemaker 1596 Baseline Aurora
******** Fin de données ********
INSERT INTO Customer (Cid, Info) VALUES (1000, |
les éléments XML sont alors réputés comme appartenant à un espace de nommage (namespace)
le choix d'un élément se fait en indiquant l'espace de nommage ou * (tous) suivit de ":"
Il faut alors écrire :
SELECT X.NOM, X.RUE, X.VILLE FROM Customer, XMLTABLE ('$c/*:customerinfo' passing INFO as "c" COLUMNS NOM CHAR(30) PATH '*:name', RUE VARCHAR(25) PATH '*:addr/*:street', VILLE VARCHAR(25) PATH '*:addr/*:city' ) AS XOu bien définir l'espace de nommage
SELECT X.nom ,x.rue, x.ville, x.pays FROM posample/Customer, XMLTABLE ( XMLNAMESPACES('http://posample.org' as "cli"), '$c/cli:customerinfo' passing INFO as "c" COLUMNS NOM CHAR(30) PATH 'cli:name', RUE VARCHAR(25) PATH 'cli:addr/cli:street', VILLE VARCHAR(25) PATH 'cli:addr/cli:city', PAYS char(30) PATH 'cli:addr/@country' ) AS X
Vous remarquerez le choix d'un attribut "@country"
Ou bien encore, définir un espace de nommage par défaut
SELECT X.nom ,x.rue, x.ville, x.pays FROM posample/Customer, XMLTABLE ( XMLNAMESPACES(DEFAULT 'http://posample.org'), '$c/customerinfo' passing INFO as "c" COLUMNS NOM CHAR(30) PATH 'name', RUE VARCHAR(25) PATH 'addr/street', VILLE VARCHAR(25) PATH 'addr/city', PAYS char(30) PATH 'addr/@country' ) AS X
Vous remarquerez la syntaxe XPATH déjà utilisée avec OmniFind et maintenant documentée sur Information Center
la PTF SF99701, level 23 apporte de nouvelles fonctions orientées web services qui se marient très bien avec XMLTABLE
httpGetBlobhttpGetClobhttpPutBlobhttpPutClobhttpPostBlobhttpPostClobhttpDeleteBlobhttpDeleteClobhttpBlobhttpClobhttpHead- UrlEncode
UrlDecode
base64Encode
base64Decode
le but de ces fonctions est de consommer des services web plutôt orientés RESTful
Regardons à travers des exemplesValues SYSTOOLS.HTTPGETCLOB('http://www.volubis.fr' ,'') ;
Récupère dans une variable le contenu de notre page d'accueil
![]()
Le premier paramètre est de type VARCHAR(2048) et représente une URL
Le deuxième paramètre est de type CLOB(10K) et représente l'entête http
- vide ( '' ) , aucune entête n'est transmise
- une chaine représentant l'entête HTTP, sous la forme
<httpHeader [options]>
<header name="entete" value="valeur" />
</httpHeader>
options possibles
- ConnectionTimeout = millisecondes
- readTimeout = millisecondes
- followRedirects = true|false (suivre les redirections en cas de status 3xx)
- useCaches = true|false (utilise rle cache, voir paramètres de la JVM)
- Voir les entêtes possible http://en.wikipedia.org/wiki/List_of_HTTP_header_fields
La valeur retour est la réponse fournie par le serveur (ce que vous aurait affiché votre navigateur)
Si le site retourne du XML, l'utilisation de la fonction XMLTABLE permettera de ne recevoir que les données utiles
Ici, le site www.redbooks.ibm.com propose des flux RSS donnant les publications récentes
![]()
le codeSELECT * FROM XMLTABLE('$result/rss/channel/item' PASSING XMLPARSE( DOCUMENT SYSTOOLS.HTTPGETBLOB('http://www.redbooks.ibm.com/rss/iseries.xml','') ) as "result" COLUMNS title VARCHAR(128) PATH 'title', description VARCHAR(1024) PATH 'description', link VARCHAR(255) PATH 'link', pubDate VARCHAR(20) PATH 'substring(pubDate, 1, 16)' ) AS RESULT;permet de lire les données de manière structurée :
![]()
Ce code permet de lire le fichier cours.xml, s'il est disponible via HTTP
SELECT cours, texte, motcle1, monthname(modif) concat '-' concat year(modif) FROM XMLTABLE('$result/AF400/COURS' PASSING XMLPARSE( DOCUMENT SYSTOOLS.HTTPGETBLOB('http://as400.volubis.intra/af4dir/courshtm/XML/cours.xml','') ) as "result" COLUMNS cours CHAR(10) PATH 'AF4MBR', texte CHAR(50) PATH 'AF4TXT', motcle1 VARCHAR(20) PATH 'MOTCL1', MODIF DATE PATH 'DATOUT' ) AS TABLEXML;
Ce code permet de le lire via HTTP, la page étant protégée par un mot de passe
-- LECTURE fichier XML via INTERNET avec authentification
SELECT cours, texte, motcle1, monthname(modif) concat '-' concat year(modif)
FROM XMLTABLE('$result/AF400/COURS'
PASSING XMLPARSE(
DOCUMENT
SYSTOOLS.HTTPGETBLOB('http://af400:motdepasse@as400.volubis.fr/af4dir/courshtm/XML/cours.xml','')
) as "result"
COLUMNS
cours CHAR(10) PATH 'AF4MBR',
texte CHAR(50) PATH 'AF4TXT',
motcle1 VARCHAR(20) PATH 'MOTCL1',
MODIF DATE PATH 'DATOUT'
) AS TABLEXML;
Vous pouvez aussi passer l'authentification dans les entêtes :
- Profil et mot de passe séparés par ":" (comme dans notre exemple) en UTF-8
- puis encodé en Base64 (voir la fonction base64ENCODE)
- enfin précédé du mot "basic"
<header name="Authorization" value="Basic bmljazpwYXNzdzByZA=="/>
httpGetBlobVerbosehttpGetClobVerbosehttpPutBlobVerbosehttpPutClobVerbosehttpPostBlobVerbosehttpPostClobVerbosehttpDeleteBlobVerbosehttpDeleteClobVerbosehttpBlobVerbosehttpClobVerbosehttpHeadVerbose
Plus d'exemples sur le cours SQLXML complet
• SI46876 permet d'insérer des données venant d'une base de données remote
Il est possible depuis la V7 d'utiliser une base "remote" de manière implicite plutôt que d'écrire connect to AUTREAS select * from mabib.matable Ecrivez select * from AUTREAS.mabib.matable la connexion doit être avec authentification automatique, c'est à dire qu'il faut avoir enregistré les paramètres d'authentification à l'avance par : ADDSVRAUTE USPRF(*CURRENT) SERVER(AUTREAS) USERID(profil-distant) PASSWORD(motdepasse-distant) Vous pourrez maintenant écrire (par exemple) INSERT INTO GESCOM.VENTES (SELECT * FROM AUTREAS.GESCOM.VENTES WHERE DATEHA = CURRENT DATE - 1 DAY)
D'ailleurs, IBM fournit deux procédures dans SYSTOOLS utilisant cette fonctionnalité
Encore une fois, ces routines sont fournies à titre d'exemple et peuvent être modifiées
• La commande CPYTOIMPF a été modifiée afin d'autoriser un critère de tri (SF99701 level 14, SF99601 level 25)
Rappel, vous pouviez déjà créer une vue dans QTEMP et copier depuis cette vue, afin de réaliser :
Mais une vue n'acceptant pas de critère de tri (Order BY), nous étions bloqués jusqu'ici.
.
•Les commandes CPYTOIMPF/CPYFRMIMPF ont été modifiées afin de gérer les entêtes de colonne (SF99701 level 16)
SF99701, level 21
• Nouvelle fonction SQL_CHECK_AUTHORITY (voir ci-dessus)
• Nouvelles procédures de comparaison de deux machines (voir ci-dessus)
• Attention la PTF SF99701 level 22 est déclarée en erreur, ne l'installez pas, installez le level 23 à la place ou la SI49730
• Vous trouverez : un certain nombre de fonctions vues et procédures (voir ci-dessus)
• Des fonctions Http pour consommer des services web
• le support de STRQMQRY par STRDBMON
• La commande RGZPFM a été modifiée afin d'autoriser un critère de reprise
Nouveau Paramètre FROMRCD
- *START , comme aujourd'hui
- *PRVRGZ, repart de la dernière réorganisation incomplète
(cas d'ajouts de lignes pendant le RGZPFM)
==> ALWCANCEL(*YES)- un-chiffre, permet de démarrer la réorganisation à une ligne donnée
• Au même niveau, la création d'objets avec des noms longs admet maintenant
FOR SYSTEM NAME permettant d'indiquer un nom système (avant il fallait renommer)
• La création de triggers SQL admet plusieurs événements
CREATE TRIGGER PERSOTRGAFTER INSERT OR DELETE OR UPDATE OF SALAIRE ON PERSONP1
REFERENCING NEW AS N OLD AS O FOR EACH ROW
BEGIN
IF INSERTING
THEN UPDATE COMPANY_STATS SET NBREMP = NBREMP + 1;
END IF;
IF DELETING
THEN UPDATE COMPANY_STATS SET NBREMP = NBREMP - 1;
END IF;
IF UPDATING AND (N.SALAIRE > 1.1 * O.SALAIRE)
THEN SIGNAL SQLSTATE '75000'
SET MESSAGE_TEXT = 'Salaire augmenté de plus de 10%'
END IF;
END
• Structure de la table SYSIXADV suite à ce correctif :
nom de la colonne (zone) | nom système | Type de donnée | Description |
TABLE_NAME | TBNAME | VARCHAR(258) | Table sur laquelle l'index est suggéré |
TABLE_SCHEMA | DBNAME | CHAR(128) | Schéma de la table |
SYSTEM_TABLE_NAME | SYS_TNAME | CHAR(10) | nom système (court) de la table |
PARTITION_NAME | TBMEMBER | CHAR(10) | Partition |
KEY_COLUMNS_ADVISED | KEYSADV | VARCHAR(16000) | nom des clés suggérées |
LEADING_COLUMN_KEYS | LEADKEYS | VARCHAR(16000) | clé principale, dont le critère de tri (croissant/décroissant) n'importe pas. |
INDEX_TYPE | INDEX_TYPE | CHAR(14) | type d'index (normal ou EVI) |
LAST_ADVISED | LASTADV | TIMESTAMP | date/heure de suggestion |
TIMES_ADVISED | TIMESADV | BIGINT | nombre de fois la suggestion a été faite |
ESTIMATED_CREATION_TIME | ESTTIME | INT | nombre de secondes(estimées) pour la création |
REASON_ADVISED | REASON | CHAR(2) | Code raison (Sélection / tri ou groupage / les deux) |
LOGICAL_PAGE_SIZE | PAGESIZE | INT | taille des pages recommandée |
MOST_EXPENSIVE_QUERY | QUERYCOST | INT | temps d'exécution le plus long |
AVERAGE_QUERY_ESTIMATE | QUERYEST | INT | temps d'exécution moyen |
TABLE_SIZE | TABLE_SIZE | BIGINT | nombre de lignes dans la table (lors de la suggestion) |
NLSS_TABLE_NAME | NLSSNAME | CHAR(10) | Séquence de tri à utiliser |
NLSS_TABLE_SCHEMA | NLSSDBNAME | CHAR(10) | Bibliothèque de la séquence de tri |
MTI_USED | MTIUSED | BIGINT | Nombre
de fois ou cet MTI a été utilisé (le système n'utilise plus un MTI, dès qu'un index permanent existe) |
MTI_CREATED | MTICREATED | INT | Nombre
de fois ou cet MTI a été créé (rappel un index MTI disparaît à l'IPL) |
LAST_MTI_USED | LASTMTIUSE | TIMESTAMP | Date/heure de dernière utilisation de cet index MTI. |
AVERAGE_QUERY_ESTIMATE _MICRO | QRYMICRO | BIGINT | temps moyen d'exécution de la requête à l'origine de cette suggestion |
EVI_DISTINCT_VALUES | EVIVALS | INTEGER | Nombre de valeurs distinctes pour création index EVI |
INCLUDE_COLUMNS | INCLCOL | CLOB(10000) | INCLUDE pour création index EVI |
FIRST_ADVISED | FIRSTADV | TIMESTAMP | Première suggestion |
SYSTEM_TABLE_SCHEMA | SYS_DNAME | CHAR(10) | Nom système de la bibliothèque |
MTI_USED_FOR_STATS * | MTISTATS | BIGINT | Nbr de fois, Index MTI utilisé pour des statistiques |
LAST_MTI_USED_FOR_STATS * | LASTMTISTA | TIMESTAMP | dernière utilisation Index MTI pour des statistiques |
DEPENDENT_ADVICE_COUNT ** | DEPCNT | CHAR(10) | Nombre de dépendances d'index (traitement de OR) |
* SF99701, level 14 : les index MTI peuvent être utilisés pour collecter des performances
** SF99701, level 23 : les index proposés sont liés et utilisables par la même requête contenant des OR
si cette zone est différente de 0.
Exemple :
select * from vins where vin_cepage1 = 'Cabernet' or vin_cepage2 = 'Cabernet' or vin_cepage3 = 'Cabernet' Contenu de SYSIXADV
INDEX_TYPE DEPENDENT_ADVICE_COUNT KEY_COLUMNS_ADVISED
----------- --------------------- -------------------
RADIX 1 VIN_CEPAGE1
RADIX 1 VIN_CEPAGE3
RADIX 1 VIN_CEPAGE2
• La taille maxi d'un index passe de 1 To à 1,7 To
• Nouvelle procédure stockée OVERRIDE_TABLE( ) dans QSYS2 pour indiquer une taille de groupage
- Paramètres
- SCHEMA : nom de la bibliothèque
- TABLE : nom de la table ou du fichier physique
- SIZE : taille de groupage ou *BUF32KB, *BUF64KB, *BUF128KB, *BUF256KB
- si vous indiquez une taille, la commande OVRDBF SEQONLY(*YES la-taille) est passée
- si vous indiquez 0, la commande DLTOVR est passée
•Paramètre REFFLD renseigné lors de l'utilisation de CREATE TABLE (SI50058)
- REFFLD d'origine, copié avec CREATE TABLE LIKE
Soit un fichier ARTICLP1 faisant référence à un répertoire
![]()
si nous créons une table par
![]()
la référence est copiée (DSPFFD ARTICLE)
![]()
- REFFLD référencant l'original avec CREATE TABLE AS
si nous créons ARTICLES par :
![]()
la référence est faite sur ARTICLP1 (et non répertoire)
![]()
Enfin les derniers services pack de Client Access (SI47412) proposent une visualisation des postes de journaux
->
L'affichage se présente comme un affichage de moniteur de performances
DB2 for i Service |
Type | Service | IBM i 7.1 |
IBM i 6.1 |
PTF | ||||
QSYS2.PTF_INFO | Vue | DSPPTF | SF99701 Level 23 | SF99601 Level 29 |
QSYS2.GROUP_PTF_INFO | Vue | WRKPTFGRP | SF99701 Level 6 | SF99601 Level 19 |
Sécurité | ||||
QSYS2.USER_INFO | Vue | RTVUSRPRF | SF99701 Level 26 | SF99601 Level 31 |
QSYS2.FUNCTION_INFO | Vue | WRKFCNUSG | SF99701 Level 26 | SF99601 Level 31 |
QSYS2.FUNCTION_USAGE | Vue | WRKFCNUSG par profil | SF99701 Level 26 | SF99601 Level 31 |
QSYS2.GROUP_PROFILE_ENTRIES | Vue | DSPUSRPRF TYPE(*GRPMBR) | SF99701 Level 23 | SF99601 Level 29 |
QSYS2.SQL_CHECK_AUTHORITY() | UDF | CHKOBJ AUT(*USE ) | SF99701 Level 21 | SF99601 Level 29 |
QSYS2.SET_COLUMN_ATTRIBUTE() | Procédure | droit de voir la colonne dans un moniteur | de base | SF99601 Level 8 |
Gestion des travaux | ||||
QSYS2.SYSTEM_VALUE_INFO | Vue | RTVSYSVAL | SF99701 Level 26 | SF99601 Level 31 |
QSYS2.GET_JOB_INFO() | UDTF | RTVJOBA/DSPJOB | SF99701 Level 23 | SF99601 Level 29 |
TCP/IP | ||||
SYSIBMADM.ENV_SYS_INFO | Vue | informations système | SF99701 Level 23 | SF99601 Level 29 |
QSYS2.TCPIP_INFO | Vue | informations TCP/IP | SF99701 Level 6 | SF99601 Level 19 |
Stockage | ||||
QSYS2.USER_STORAGE | Vue | DSPUSRPRF / mémoire utilisée | SF99701 Level 26 | SF99601 Level 31 |
QSYS2.SYSDISKSTAT | Vue | WRKDSKSTS | SF99701 Level 12 | SF99601 Level 21 |
Objets | ||||
QSYS2.OBJECT_STATISTICS() | UDTF | DSPOBJD | SF99701 Level 3 | SF99601 Level 16 |
Limites du système | ||||
QSYS2.SYSLIMTBL | Table | Alertes sur événements base de données (voir OnDemand Tracking ci dessous) |
SF99701 Level 23 Amélioration en : SF99701 Level 26 |
SF99601 Level 29 Amélioration en : SF99601 Level 31 |
QSYS2.SYSLIMITS | Vue | basé sur SYSLMTTBL , complété par des infos système |
SF99701 Level 23 Amélioration en : SF99701 Level 26 |
SF99601 Level 29 Amélioration en : SF99601 Level 31 |
Journal | ||||
QSYS2.DISPLAY_JOURNAL() | UDTF | DSPJRN | de base |
SF99601 Level 15 |
Exécution de commande | ||||
QSYS2.QCMDEXC() | Procédure | Exécution de commande | de base Amélioration en : SF99701 Level 26 |
SF99601 Level 15 Amélioration en : SF99601 Level 3 |
But du jeu, fournir des alertes sur les événements base de données pouvant impacter les limites du système, plutôt que de subir un arrêt de traitement ou des lenteurs
IBM indique les limites physiques de l'OS dans ce document : http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/topic/rzamp/rzamp.pdf
les limites DB2 sont aussi fournies dans le fichier du catalogue SQL_SIZING
La mise en place de la phase 1 du projet est arrivée avec SF99601 level 26 (V6) ou SF99701 level 23 (V7)
Il s'agissait de définir des seuils d'alerte par fonction
A ces fonctions pouvant présenter une limite, on va associer :
les fonctions de la phase 1 (Level 23)
les dépassements de seuils sont notifiés dans un fichier système : SYSLIMTBL
Cette gestion des événements est assurée par des travaux à très faible priorité (QDBSRVxx)
les fonctions ajoutées en phase 2 (level 26)
une vue est proposée SYSLIMITS faisant le lien entre SYSLIMTBL, SQL_SIZING et avec la fonction table GET_JOB_INFO()
Il a un système nettoyage automatique (PRUNE) sur SYSLMTTBL
Contrairement aux autres vues du catalogue SQL, vous pouvez associer à SYSLMTTBL un trigger (AFTER INSERT et/ou AFTER DELETE)
LAST_CHANGE_TIMESTAMP | TIMESTAMP | dernière modification |
LIMIT_CATEGORY | SMALLINT | 0 : Database 1 : Journal 2 : Sécurité 3 : Divers 4 : Gestion des travaux 5 : Système de fichier 6 : Sauvegarde/restauration 7 : Gestion de Cluster 8 : Communication |
LIMIT_TYPE | SMALLINT | 1 : Objet |
LIMIT_ID | INTEGER | pour faire la jointure avec SQL_SIZING |
JOB_NAME | VARCHAR(28) | coordonnées du travail |
USER_NAME | VARCHAR(10) | Profil |
CURRENT_VALUE | BIGINT | valeur rencontrée |
SYSTEM_OBJECT_NAME | VARCHAR(30) | objet concerné ou NULL |
SYSTEM_TABLE_MEMBER | VARCHAR(10) | membre ou NULL |
OBJECT-TYPE | VARCHAR(7) | type d'objet |
ASP_NUMBER | SMALLINT | N° d'ASP |
dans le centre de santé
Onglet System Limits
Il faut commencer par définir des critères (bouton modification)
Le lien étant fait avec SQL_SIZING on peut vous indiquer si ce seuil est proche des limites du système ou pas.
Limites objets :
Limites travaux :
cela permet de placer une série d'instructions SQL PSM (PL/SQL) hors programme (dans un contexte interprété)
un programme est généré à la volée dans QTEMP.
Exemples :
Ce source peut désormais être lancé par RUNSQLSTM |
************** Début des données *************************** CREATE TABLE QTEMP/CAVMAX (CUMUL DEC(10 , 2) , QUAND DATE) ; BEGIN DECLARE CUMUL DEC(10 , 2); SELECT SUM(CAV_PRIX) INTO CUMUL FROM BDVIN1/MA_CAVE; IF (CUMUL > 100) THEN INSERT INTO CAVMAX VALUES(CUMUL, CURRENT DATE) WITH NC; END IF; END; *************** Fin des données **************************** |
ou par System i Navigator |
Ce source de type CLP a été compilé et s'éxécute correctement |
PGM CHKOBJ QTEMP/CAVMAX *FILE MONMSG CPF9801 EXEC( + RUNSQL ('CREATE TABLE QTEMP/CAVMAX (CUMUL DEC(10 , 2) , + QUAND DATE)') ) RUNSQL SQL(' + BEGIN + DECLARE CUMUL DEC(10 , 2); + SELECT SUM(CAV_PRIX) INTO CUMUL FROM BDVIN1/MA_CAVE; + IF (CUMUL > 100) THEN + INSERT INTO CAVMAX VALUES(CUMUL, CURRENT DATE); + END IF; + END + ') COMMIT(*NONE) ENDPGM |
Remarques
• Pour une procédure, un trigger ou une fonction écrit en PL/SQL, vous pouvez désormais debuger au niveau SQL
(et non au niveau du C généré), avec SET OPTION DBGVIEW = *SOURCE
Pour voir les variables, Il faut
simplement avoir mis un label au niveau du pgm et demander LABEL.VARIABLE (en majuscules)
ici TRT.CUMUL
• Le nouveau paramètre de la V7 DFRID permet de restaurer un physique APRES le(les) logiques ou Tables matérialisées (MQT).
Ceci est une fonction de base de la V7
Le level 26 des PTF Database permet d'appliquer ce mode fonctionnement (évitant une double restauration) aux journaux :
Il est possible désormais de restaurer des fichiers, des DataArea et des DTAQ, puis de restaurer le journal (objets dans BIBA, journal dans BIBJ)
les objets sont automatiquement journalisés dès que le journal est restauré.
Comme avec les logiques
- Soit vous utilisez le même DFRID sur les commandes de restauration (RSTLIB, RSTOBJ, RST)
- Soit vous utilisez la commande RSTDFROBJ
• Il est possible d'utiliser une dénomination en trois partie sur un ordre SQL(voir plus haut)
plutôt que d'écrire connect to AUTREAS select * from mabib.matable Ecrivez select * from AUTREAS.mabib.matable
Cette syntaxe s'applique désormais aussi aux ALIAS
Et l'Alias peut être modifié dynamiquement :
CHGRDBDIRE RDB(I5TEST AUTREAS) RMTLOCNAME(i5test.volubis.intra' *IP)
INSERT INTO GESCOM.VENTES
(SELECT * FROM AUTREAS.GESCOM.VENTES WHERE DATEHA = CURRENT DATE - 1 DAY)
CHGRDBDIRE RDB(I5PROD AUTREAS) RMTLOCNAME(i5prod.volubis.intra' *IP)
INSERT INTO GESCOM.VENTES
(SELECT * FROM AUTREAS.GESCOM.VENTES WHERE DATEHA = CURRENT DATE - 1 DAY)
• Les fichiers du catalogues système de gestion des droits , soit :
SYSCOLAUTH | Droits sur les colonnes |
SYSPACKAGEAUTH | Droits sur les *SQLPKG |
SYSROUTINEAUTH | Droits sur les procédures/fonctions |
SYSSCHEMAAUTH | Droits sur les bibliothèques |
SYSSEQUENCEAUTH | Droits sur les séquences |
SYSTABAUTH | Droits sur les tables |
SYSUDTAUTH | Droits sur les fonctions Tables |
SYSVARIABLEAUTH * | Droit sur les variables globales (*SRVPGM) |
SYSXSROBJECTAUTH * | Droits sur les schémas XML (*XSROBJ) |
* V7 Uniquement |
Possèdent maintenant une nouvelle colonne AUTHORIZATION_LIST (liste d'autorisation)
Si cette colonne est à NULL, les droits affichés viennent de l'objet, sinon de cette liste d'autorisation
• Deux nouvelles informations liées aux propriétés du cache des plans d'accès
Visible via System i Navigator mais aussi par QSYS2.DUMP_PLAN_CACHE_PROPERTIES()
Elles correspondent aux plans liés à des tables déclarées
GLOBAL TEMPORARY TABLE (dans QTEMP)
Les PTF MF57716,MF57717,MF57718 et SI51455 (plus SI50567 coté client) , fournissent en plus :
• Le déplacement en temps réel des objets Database sur disque SSD, ne pouvait se faire que lorsque les objets n'étaient plus utilisés
(CHGPF UNIT(*SSD) ou ALTER TABLE UNIT SSD)
Désormais cela sera compatible avec un verrouillage *SHRRD ou *SHRUPD, rendant l'opération plus souple.
• Nouvelles informations affichées par system i Navigator
Sur un moniteur de performances, l'affichage de la vue "program summary"
Affiche des informations détaillées par programme :
ces quatre colonnes concernant les I/O disques, sont nouvelles
Dans l'arborescence "Maintenance base de données", l'option construction d'index, vous indique
• Nouvelles fonctions de modernisation de la base
Option de génération d'index supplémentaire , choix Génération de vue vs index.
Soit les fichiers physiques et logiques suivants :
Clientp1 | Cdeentp1 | Cdedetp1 |
|
R CDEENTF1 TEXT('FICHIER COMMANDES' NOCDE 6 0 TEXT('N° CDE') NOCLI 6 0 TEXT('N° CLIENT') DATCDE L TEXT('DATE CDE') DATLIV L TEXT('DATE LIV') |
R CDEDETF1 TEXT('FICHIER L COMMANDES') NOCDE 6 0 TEXT('N° CDE') NOLIG 3 0 TEXT('N° LIGNE') CODART 10 TEXT('CODE ARTICLE') QTECDE 7 2 TEXT('QTE CDE') |
Clientl1 (logique simple) | ||
R CLIENTF1 PFILE(CLIENTP1) K NOMCLI |
||
Clientl2 (redéfinition de format + sélection/omission) | ||
R CLIENTF2 PFILE(CLIENTP1) |
||
ClientJF (fichier logique joint) | ||
|
R CLIENTJF JFILE(CLIENTP1 CDEENTP1 + CDEDETP1) J JOIN(1 2) JFLD(NOCLI NOCLI) J JOIN(2 3) JFLD(NOCDE NOCDE) NOMCLI DEPCLI BDIS DATCDE DATLIV CODART QTECDE K NOMCLI |
L'option de génération SQL "standard",
génère le code suivant (essentiellement des vues SQL) :
CREATE TABLE FORMATION1/CLIENTP1 ( NOCLI DECIMAL(6, 0) NOT NULL DEFAULT 0 , NOMCLI CHAR(30) CCSID 297 NOT NULL DEFAULT '' , ADR1 CHAR(35) CCSID 297 NOT NULL DEFAULT '' , ADR2 CHAR(30) CCSID 297 NOT NULL DEFAULT '' , DEPCLI NUMERIC(2, 0) NOT NULL DEFAULT 0 , BDIS NUMERIC(3, 0) NOT NULL DEFAULT 0 , DATCRT DATE NOT NULL DEFAULT CURRENT_DATE ) RCDFMT CLIENTF1 ; CREATE VIEW FORMATION1/CLIENTL1 ( -- SQL1506 30 Clé ou attribut ignoré pour CLIENTL1 de FORMATION1. NOCLI , NOMCLI , ADR1 , ADR2 , DEPCLI , BDIS , DATCRT ) AS SELECT NOCLI , NOMCLI , ADR1 , ADR2 , DEPCLI , BDIS , DATCRT FROM FORMATION1/CLIENTP1 RCDFMT CLIENTF1 ; CREATE VIEW FORMATION1/CLIENTL2 ( -- SQL1506 30 Clé ou attribut ignoré pour CLIENTL2 de FORMATION1. NOMCLI , ADR1 , ADR2 , DEPCLI , BDIS ) AS SELECT NOMCLI , ADR1 , ADR2 , DEPCLI , BDIS FROM FORMATION1/CLIENTP1 |
En cochant Generate additionnal Indexes, cela ajoute les index implicitement créés dans les logiques
--suite à CREATE VIEW FORMATION1/CLIENTL1 ../... CREATE INDEX FORMATION1/CLIENTL1_QSQGNDDL_00001 |
En cochant Generate index instead of view (exclusive de l'option précédente)
--CREATE INDEX CLIENTL1 à la place de vue CREATE INDEX FORMATION1/CLIENTL1 |
Comme la fonction DISPLAY_JOURNAL() a été modifiée, de nouvelles colonnes sont proposées à l'affichage du contenu d'un journal (F12)
System i Navigator -> Navigator for I (version Web) ->
• Navigator for I
La PTF SI48982 propose une nouvelle procédure pour OmniFind lors de l'indexation de fichiers de l'IFS : ADD_IFS_STMF_OBJECT_SET_WITH_SUBDIR
permettant lors de l'ajout d'un répertoire à un Index OmniFind, d'ajouter automatiquement les sous répertoires
Cette option se retrouve
dans Navigator for i (SF99368 Level 22 minimum)
L'option Create collection propose un interface à la procédure SYSTS_CRTCOL
L'option Collection List, liste les index OmniFind créés par
SYSTS_CRTCOL
, properties permettant une maintenance des objets indexés
->
Enfin Search permet une recherche dans l'index
Résultat
• GENERATE_SQL() permet d'obtenir le source SQL d'un élément base de données dans un membre source, par procédure
(ceci correspond à l'option de system i Navigator "génération d'instruction SQL" )
• DELIMIT_NAME() génère les délimiteurs (" et ') quand c'est nécessaire pour un nom de table
DELIMIT_NAME('test"name') -> "test""name
• EXTRACT_STATEMENT retourne des informations sur le contenu d'une image instantanée du cache des plans d'accès
(générée par System i Navigator ou QSYS2.DUMP_PLAN_CACHE)
• QSYS2.DUMP_PLAN_CACHE_topN, génère une image instantanée avec les plans des N instructions les plus consommatrices
CALL QSYS2.DUMP_PLAN_CACHE_topN(’MABIB’, ’TOPN20’, 20);-- génère une image instantanée nommée TOPN20 dans MABIB, avec les 20 instructions ayant le temps de traitement cumulé le plus long
• RESTART_IDENTITY() permet pour une table dupliquée d'avoir comme prochaine valeur d'un champ AS IDENTITY la même que la table d'origine
• Deux nouvelles tables du catalogue SQL pour les ordres SQL « Embeded »
SysPackageStmtStat, contient une ligne par instruction contenue dans un *SQLPKG
SysProgramStmtStat, contient une ligne par instruction contenue dans un programme (*PGM)
• SQE possède, désormais, la faculté de détecter les instructions SQL complexes exécutées en parallèle.
Dans ce cas, il ne fabrique pas de plus de
3 plans concurremment et attends plutôt la production des plans en cours avant de lancer la requête...
• Nous avons vu que les registres clients (Client ProgramID, Client APPLNAME, etc...) sont désormais aussi renseignés pour :
Ils le seront aussi en Level 29 pour DDM/DRDA
• La fonction table GET_JOB_INFO du level 23 a été modifiée
V_JOB_STATUS | CHAR(10) | Status du job |
V_ACTIVE_JOB _STATUS | CHAR(4) | Etat actuel (RUN, DSPW, MSGW, etc)... voir l'API QUSRJOBI |
V_RUN _PRIORITY | Integer | priorité machine |
V_SBS_NAME | CHAR(10) | Sous système |
V_CPU_USED | BIGINT | CPU consommée |
V_TEMP_STORAGE_USED_MB | Integer | Mémoire temporaire consommée |
V_AUX_IO_REQUESTED | BIGINT | Nombre d'I/O |
V_PAGE_FAULTS | BIGINT | Nombre de défaut de page |
V_CLIENT_WRKSTNNAME | CHAR(255) | registre client * , nom du client |
V_CLIENT_APPLNAME | CHAR(255) | registre client, nom de l'application |
V_CLIENT_ACCTNG | CHAR(255) | registre client, code accounting |
V_CLIENT_PROGRAMID | CHAR(255) | registre client, nom de l'exécutable |
V_CLIENT_USERID | CHAR(255) | registre client, nom de l'utilisateur |
V_SQL_STATEMENT_TEXT | VARCHAR(10000) | Dernière instruction SQL |
• L'ordre de recherche des authentificaitons enregistrée pour DDM/DRDA (ADDSVRAUTE) change
•Enfin le correctif de fin Mai sur Client Access, doit apporter à System i Navigator
Copyright © 2013/2014 VOLUBIS