DB2 UDB for i5/OS, Administration

 

I/ Syntaxe SQL


|


    SQL/400 gestionnaire de base de données.    -----------------------------------------
    ORDRES SQL EXECUTABLES SUR L'ECRAN SQL-INTERACTIF (strsql)      OU DANS UN SCRIPT SQL (lancé par RUNSQLSTM ou par ISeries Navigatror)

      1/ CREATION d'UNE COLLECTION ou SCHEMA
    CREATE COLLECTION/SCHEMA -nom-collection---------------
 (exemple SQLDB),  Sont alors créés :
              Objet créé   ! NOM             ! Type OS/400        ------------------------------------------------------               Bibliotheque ! SQLDB           ! *LIB                            !                 !               Journal      ! SQLDB/QSQJRN    ! *JRN                            !                 !               récepteur    ! SQLDB/QSQJRN0001! *JRNRCV


|
  Contenu initial d'une collection SQL 


     Objet      Type     Attr    Texte
     -------    -------  ----   -------------------------------
     QSQJRN0001  *JRNRCV        Base de données créée par SQL
     QSQJRN     *JRN            Base de données créée par SQL
    plus les fichiers suivants constituant le catalogue SQL      
     SYSCOLUMNS *FILE     LF    une ligne par colonne de table
     SYSCST     *FILE     LF    une ligne par contrainte
     SYSCSTCOL  *FILE     LF    une ligne par colonne de contrainte
     SYSCSTDEP  *FILE     LF    une ligne par dépendance de contrainte
     SYSINDEXES *FILE     LF    une ligne par index
     SYSKEYCST  *FILE     LF    une ligne par clé de contrainte
     SYSKEYS    *FILE     LF    une ligne par clé d'index
     SYSPACKAGE *FILE     LF    une ligne par package (pgm contenant du SQL)
     SYSREFCST  *FILE     LF    une ligne par référence de contrainte
     SYSTABLES  *FILE     LF    une ligne par table
     SYSVIEWDEP *FILE     LF    une ligne par dépendance vue/table
     SYSVIEWS   *FILE     LF    une ligne par vue
     SYSPROCS   *FILE     LF    une ligne par procédure cataloguée
     SYSFUNCS   *FILE     LF    une ligne par fonction SQL (UDF)
     SYSPARMS   *FILE     LF    une ligne par paramètre (proc ou fonction)

 

CREATE TABLE
|

     2/ CREATION D'OBJETS (Possible dans toute bibliothèque)

         a) TABLE (Fichier physique sans clé, sauf contrainte)
         CREATE TABLE  nom
      !-->      (nomcolonne--FOR COLUMN-nom--type(lg)--------------       !       !          >-------------------------------------------------   x   !              !-Clause WITH DEFAULT--!  fois !       !          >-------------------------------------------------)       ---            !--contrainte liée à une colonne--!
                 >-------------------------------------------------                       !--contrainte liée à plusieurs colonnes--!
                 >-------------------------------------------------                      -!-NOT LOGGED INITIALLY--! (V6R10)
                 >-----------------------------------------------------.                      -!-RCDFMT -nom-format-! (V5R40) !- UNIT SSD-(V7)-!

|
  Exemple :

         CREATE TABLE  SQLDB/STGTBL                 (NUMEROSTAGIAIRE for column NOSTAG DEC(3, 0) not null ,                  NOMSTAGIAIRE for column NOM  CHAR(15) not null ,                  PRENOM CHAR(15) not null with default,                  AGENCE NUMERIC(2, 0) not null REFERENCES FAGENCE,                  NOTE   NUMERIC(4, 2) not null with default,  ENTREE DATE )             RCDFMT STGTBLF1
  Explications :
            Les noms longs sont acceptés :
                NUMEROSTAGIAIRE est le nom SQL   [30 c pour les colonnes,                                                  128 c pour les objets]                 NOSTAG est le nom système
            il sont gérés comme des ALIAS pour les colonnes, pour les tables              le nom OS/400 est généré à partir des cinq premièrs caractères,              sauf à ajouter FOR SYSTEM NAME nom-sur-10 (nouveauté V7)

|


NOT LOGGED INITIALLY
    indique que la table n'est pas journalisée automatiquement
  sinon, la table est journalisée automatiquement, si possible :

  La journalisation automatique pouvant être définie par :
     1/ la présence d'un journal QSQJRN
     2/ la présence d'une data area QDFTJRN indiquant le nom du journal
     3/ le fait d'avoir utilisé la commande STRJRNLIB sur la bibliothèque         (ce dernier point est aussi nouveau en V6R10)

 UNIT SSD
     indique une préférence de stockage sur un disque SSD pour cette table.

|

         Types de variable admis:  (l=longueur, d=nbr de décimales)
                + NUMERIC(l, d)  numérique étendu
                + DECIMAL(l, d)                   ou DEC(l, d)   numérique packé
                + SMALLINT       binaire sur 2 octets                 + INTEGER        binaire sur 4 octets                 + BIGINT         binaire sur 8 octets (V4R50)
                + CHARACTER(l)                   ou CHAR(l)     alphanumérique
                + VARCHAR(x) ALLOCATE(y) alphanumérique à lg variable
                          x est la plus grande longueur admise
                           y est la longeur minimum allouée par le système.
                          [DSPFFD et DSPPFM montre la zone de longueur X]

|

                + FLOAT et REAL  numérique virgule flottante                                  (notation scientifique)
                + DATE           une date

                + TIME           un horaire

                + TIMESTAMP      horodatage (date+heure+microsecondes)
                   FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP (V6R10)

                    attribut ajouté à une zone TIMESTAMP NOT NULL,                     indique que cette colonne est modifiée avec le timestamp                      en cours à chaque INSERT/UPDATE

               Il ne peut y avoir qu'une seule colonne de ce type par table.

|


                + BLOB(n K|M)    champ binaire (image/vidéo..) dont la                                   taille peut atteindre 2 Go.
                + CLOB           champ texte (notion de CCSID) dont la                                   taille peut atteindre 2 Go.
                + (un-type)      champ faisant référence à un type                                   créé par l'utilisateur à l'aide de :
                                   CREATE DISTINCT TYPE

 exemples :
     CREATE DISTINCT TYPE IMAGE AS BLOB(512K)
     CREATE DISTINCT TYPE EUROS AS DECIMAL(9, 2)
     CREATE DISTINCT TYPE FRANCS AS DECIMAL(9, 2)

|

vous pouvez maintenant créer une table par

     CREATE TABLE VOITURES
            (CODE CHAR(10) NOT NULL PRIMARY KEY,              PRIXf FRANCS NOT NULL, PRIXe EUROS ,              PHOTO IMAGE )
 la particularité de ces types est qu'ils sont fortement typés 
    c'est à dire que l'on ne PEUT PAS COMPARER DES FRANCS et DES EUROS.
   WHERE PRIXF > PRIXE  ou PRIXE > 50 sont syntaxiquement invalides !!!

le système assure une convertion avec le type d'origine,(CAST ou "type()")
  WHERE CAST(PRIXF as DECIMAL(9, 2)) > 10000 est admis
  WHERE PRIXF > FRANCS(10000) aussi

|
 type de données(suite)

                + DATA LINK      champ contenant un lien vers un fichier
       >--------LINK TYPE URL----->

              -------NO LINK CONTROL-----------------------------------        >-----                                                           - --               ---FILE LINK CONTROL----                                -                                      |   INTEGRITY ALL           *   |                                      |   READ PERMISSION FS          |                                      |   READ PERMISSION DB          |                                      |-- WRITE PERMISSION FS      ---|                                          WRITE PERMISSION BLOCKED                                          RECOVERY NO                                          ON UNLINK RESTORE                                          ON UNLINK DELETE
  * indique si le fichier reste accessible au système de fichier et avec      quels droit (FS : les droits du système de fichier,                   DB : les droits de la base uniquement)

|

 Avec FILE LINK CONTROL, le système vérifie la présence du fichier externe   et garantie son intégrité, tant qu'il est référencé par la base
 Il ne peut être référencé que par une seule ligne.
 sur AS/400, il faut
 initialiser le gestionnaire DLFM (une fois par machine) par INZDLFM
 démarrer ce service :
   STRTCPSVR  SERVER(*DLFM)
 indiquer le(les) répertoire(s) dont il faut assurer l'intégrité :
   ADDPFXDLFM PREFIX(('/AF4DIR))
 enregistrer la bibliothèque contenant des tables avec DataLink :
   ADDHDBDLFM HOSTDBLIB((AF400)) HOSTDB(AS400)

|
 type de données(suite)

   - clé générée automatiquement, deux syntaxes :
     A/ ROWID. Il s'agit de variable VARCHAR(40) contenant des valeur généré                 de manière non consécutive.
        Create TABLE test1 (ID ROWID GENERATED ALWAYS ,                             LIB CHAR(40), DATCRT DATE)

     B/ AS IDENTITY , est associé à un champ numérique sans décimale,
        Create TABLE test1 (ID INTEGER AS IDENTITY START WITH 100,                               LIB CHAR(40), DATCRT DATE)

     > dans les deux cas on peut préciser :
                    --ALWAYS--------      toujours        GENERATED ---                --->                     -- BY DEFAULT---      uniquement si la zone est nulle

|

    on peut ensuite préciser, avec AS IDENTITY :
    --START WITH (valeur initiale)----------------->
    >-INCREMENT BY (incrément)---------------------->
        --MINVALUE (valeur mini) -     >--                           ----------------->         --NO MINVALUE ---------- -
       --MAXVALUE (valeur maxi) -     >--                           ----------------->        --NO MAXVALUE ---------- -
       -- CYCLE----------    ---ORDER-------     >--                  ----               ------->        --NO CYCLE--------    --- NO ORDER---
 avec CYCLE, quand MAXVALUE est atteint on recommence à MINVALUE.  NO ORDER indique une numérotation qui peut ne pas être réalisée dans   l'ordre  des requêtes.

|

  et enfin :
         -- CACHE x ----                  indique que DB2/400 peut garder     >----               -------------- .  en mémoire les x dernières valeurs          --NO CACHE----                    (plus rapide)

  AS IDENTITY est un attribut d'un champ numérique
  ROWID est un nouveau type de champ
  Exemple :
  CREATE TABLE TABCDE       (CDENO SMALLINT NOT NULL          GENERATED ALWAYS AS IDENTITY                             (START WITH 500                              INCREMENT BY 1                              CYCLE),        LIVREA VARCHAR (36) ,        CDEDAT DATE)

|
type de données(suite, V6)

               + DECFLOAT  nouveau format numérique 16 ou 32 Chiffres, à la                             norme IEEE 754R permettant le stockage de :
           ° valeurs décimales très grandes:
             16: -9.999999999999999x10 p.384 à 9.999999999999999x10 p.384              32:  -9.999999999999999999999999999999999x10 puissance 6144                   à 9.999999999999999999999999999999999x10 puissance 6144

           ° le zéro signé + et -
           ° la valeur infinie (INFINITY) positive ou négative
           ° la valeur "quiet NaN" (not a number=NAN)                 résultat d'un calcul invalide ne provoquant pas d'erreur
           °  la valeur "signal NaN"(SNAN)                 résultat d'un calcul invalide provoquant une erreur

|

               + NCHAR ou NATIONAL CHAR
               + NVARCHAR ou NATIONAL VARCHAR
               + NCLOB ou NATIONAL CLOB
                  nouveaux types de donnée automatiquement en UNICODE (1200)
               + XML (V7)
                  Les champs de type XML peuvent faire jusqu'à 2 Go,                    la totalité d'une ligne, ne peut pas dépasser 3,5 Go.
                  Ils sont stockés dans le CCSID indiqué par                    SQL_XML_DATA_CCSID dans QAQQINI, UTF-8 (1208) par défaut.
                  On peut insérer une chaîne ou bien utiliser la fonction                    GET_XML_FILE
                  le document doit être bien formé,                      sinon vous recevrez l'erreur SQ20398

|

Contrôle de présence (val obligatoire/facultative)
 -----------------------------------------------------------------------.       !-- NOT NULL---------------------------------------------------!       !------------------------- WITH DEFAULT---------------------!                                                !--'constante'----!                                                !---NULL----------!                                                !---USER----------!                                                !--CURRENT_DATE---!                                                !--CURRENT_TIME---!                                                !CURRENT_TIMESTAMP!        - pas d'indication = valeur nulle admise
       - NOT NULL              interdit la valeur nulle
       - NOT NULL WITH DEFAULT initialise à valeur par dft
IMPLICITLY HIDDEN  (V6, facultatif, NOT HIDDEN est le défaut)
   cette colonne n'apparait pas sur un "select * from la-table",     mais uniquement si vous la demandez.

|
 Contraintes d'entité: 

     - désignation d'une clé unique (pour les valeurs non nulles)
              -------------------------------- UNIQUE--------------------                 |--CONSTRAINT nom-contrainte-|         |-(zonea, zoneb)-| 
               + si CONSTRAINT nom-contrainte n'est pas renseigné le                   système génère automatiquement un nom par défaut
               + utilisable associé directement à une colonne
                            CREATE TABLE (zone1 dec(3,0) UNIQUE,                                           zone2 char(30), ...
                 ou fin de définition de table si l'unicité est demandée sur                   plusieurs colonnes:
                            CREATE TABLE (zone1 dec(3, 0),                                           zone2 char(30),                                           zone3 dec(2, 0),                                    UNIQUE(zone1, zone3))

|

            un index est crée avec la table (il fait partie de la table)
     - désignation d'une clé primaire (identifiant univoque).
              -------------------------------- PRIMARY KEY---------------                 |--CONSTRAINT nom-contrainte-|             |-(zonea, ..)-| 
               + les clés primaires doivent être définies NOT NULL
               + même syntaxe que l'unicité
               + il peut y avoir plusieurs contraintes d'unicité,                   il ne peut y avoir qu'UNE SEULE clé primaire.

   CREATE TABLE (zone1 dec(3, 0),  !  CREATE TABLE (zone1 dec(3, 0),                  zone2 char(30)    !                zone2 char(30),                   PRIMARY KEY,     !                zone3 dec(2, 0),                  zone3 dec(2, 0)   !         PRIMARY KEY(zone1, zone2))                                    !

|

 Contraintes d'intégrité référentielle: 
            Il s'agit de concrétiser le lien exitant entre deux tables.                (ce qui était réalisé jusqu'ici par programme)             par des déclarations de contraintes
 syntaxe générale
     ---------------------------------------------------------------------->        |                           |    |                        |        |-CONSTRAINT nom-contrainte-|    |-FOREIGN KEY-(zone,...)-|

         >------------REFERENCES autre-table-----------------------------                                           |                        |                                           |--(zone1 [, zone2 ...])-|
         >---------------------------------------------------------------                       |                   |  |                    |                       |--ON DELETE action-|  |-- ON UPDATE action-|

|
Exemple :
               create table command (NUMCDE DEC(6, 0) NOT NULL,
                                     ARTCDE CHAR(6) REFERENCES article,
                                     NUMCLI DEC(6, 0) REFERENCES clients)

               ici le code article doit exister dans la table article                    le n° de client doit exister dans la table clients.
   Comme avec les contraintes d'unicité et de clé primaire, si la clause     CONSTRAINT n'est pas employée, le système génère un nom par défaut.
Ou bien  (si la référence porte sur plusieurs colonnes)
               FOREIGN KEY(zone1, zone2, ..) REFERENCES table
               create table livraison (NUMLIV DEC(6, 0) NOT NULL,                                        NUMCDE DEC(6, 0) NOT NULL,                                        NOLIGN DEC(3, 0) NOT NULL,                                        FOREIGN KEY(numcde, nolign)                                                REFERENCES lcommand)
               ici une livraison doit référencer une commande existante.

|

 ON DELETE, ON UPDATE :
            que faire si l'on supprime une ligne du fichier parent                       si l'on change la clé dans le fichier parent
    NO ACTION :  ne rien faire,l'événement est interdit.                  le contrôle a lieu lors du COMMIT,                   la journalisation est OBLIGATOIRE.
    RESTRICT  :  ne rien faire,l'événement est interdit.                  le contrôle est immédiat, la journalisation facultative
    CASCADE   :  en cas de suppression, suppression des lignes associées                   dans la table qui  référence.                                    (en cas de suppression d'un client,                                      suppression de toutes ses commandes)
    SET NULL  :  l'événement est autorisé et la clé étrangère de la table                   qui référence est mise à NULL (NULL doit être autorisé)
    SET DEFAULT: idem SET NULL avec la valeur/dft

|

 Check Contraints ou contraintes de domaine :
    il s'agit d'établir un contrôle sur une zone (doit être > à , <> de ...)      devant être TOUJOURS vérifié.
    ces nouvelles contraintes seront vérifiés dans toutes les conditions
    en cas d'erreur ==> message CPF502F 

     ---------------------------------- CHECK ----------------------->        |                           |        |-CONSTRAINT nom-contrainte-|

     ---( test logique valide)---.
    ..........................................................     : Create table  entcdep1  Datcde DATE , Datliv DATE      :     :          Check (datliv > datcmd), ...                  :     :........................................................:

|

la version 5.10 apporte la création de table par copie de structure :
     CREATE TABLE2 LIKE TABLE1 (table2 est identique à table1)
     CREATE TABLE3 (like table1 , autrezone char(10))
       même liste de champs PLUS un/des champ(s) spécifique(s).
   SQL admet, en plus, en V5R20 la syntaxe suivante, permettant         une duplication partielle de la liste des zones [du format] :
      CREATE TABLE nom-fichier AS (SELECT de sous-sélection)             WITH [NO] DATA
     une référence sur la table d'origine est faite (V7 + SF99701 level 24)
     avec WITH DATA, les données sont dupliquées suite à la création.
  Exemple :     CREATE TABLE CLITMP AS (SELECT nomcli, adr1, adr2, dept, ville from cli)             WITH NO DATA

|

Il y a alors des options de copie :
   .---------------------------------------------------------------.    |                         .-COLUMN ATTRIBUTES-.                 |    |   .-EXCLUDING IDENTITY--+-------------------+-.               |    V   |                     .-COLUMN ATTRIBUTES-. |               | >----+-+-INCLUDING IDENTITY--+-------------------+-+-------------+-+-->      |              .-COLUMN-.                                   |      | .-EXCLUDING--+--------+--DEFAULTS-.                       |      | |            .-COLUMN-.           |                       |      +-+-INCLUDING--+--------+--DEFAULTS-+-----------------------+      | '-USING TYPE DEFAULTS-------------'                       |      |                                .-COLUMN ATTRIBUTES-.      |      | .-EXCLUDING IMPLICITLY HIDDEN -+-------------------+-.    |      | |                              .-COLUMN ATTRIBUTES-. |    |      +-+-INCLUDING IMPLICITLY HIDDEN -+-------------------+-+----+      |                                   .-COLUMN ATTRIBUTES-.   |      | .-EXCLUDING ROW CHANGE TIMESTAMP -+-------------------+-. |      | |                                 .-COLUMN ATTRIBUTES-. | |      '-+-INCLUDING ROW CHANGE TIMESTAMP -+-------------------+-+-'

 | 
 
   Vous pouvez utiliser cette technique pour faire référence à un répertoire

     Exemple :

     CREATE TABLE ClientsAS (SELECT nomcli, adr1, adr2, dept, ville
      from REPERTP1) WITH NO DATA

       les REFFLD sont désormais générés pour la table clients
         NOCLI      CONDEN       6  0       4         1        E-S      N°
                                                                     CLIENT
       Texte descriptif de la zone . . . . . . . :  N° CLIENT
       Information de référence
         Fichier référencé . . . . . . . . . . . :  REPERTP1
           Bibliothèque  . . . . . . . . . . . . :  FORMATION1
         Format référencé  . . . . . . . . . . . :  REPERTF1
         Zone référencée . . . . . . . . . . . . :  NOCLI    


 | 

   Vous pouvez renommer les zones par le biais d'un alias (AS)
     Exemple :

     CREATE TABLE ClientsAS (SELECT nomcli, adr1 AS ADRCLI , adr2, dept, ville
      from REPERTP1) WITH NO DATA


       les REFFLD sont désormais générés en conséquence
         ADRCLI     CONDEN       6  0       4         1        E-S      N°
                                                                     CLIENT

       Texte descriptif de la zone . . . . . . . :  Adresse client
       Information de référence
         Fichier référencé . . . . . . . . . . . :  REPERTP1
           Bibliothèque  . . . . . . . . . . . . :  FORMATION1
         Format référencé  . . . . . . . . . . . :  REPERTF1
         Zone référencée . . . . . . . . . . . . :  ADR1    


ALTER TABLE
|


Il est possible d'ajouter/retirer une contrainte par l'ordre ALTER TABLE :

                          |--ADD--->        ALTER TABLE nom ---                           |--DROP-->

           |--contrainte d'unicité (même syntaxe que CREATE TABLE)---|   >---ADD--                                                          |            |--contrainte référentielle(même syntaxe que CREATE TABLE-|

  >---DROP-----PRIMARY KEY-------------------------------------------             |                                        |             |--FOREIGN KEY-|                         |             |--UNIQUE------|-- nom de la contrainte--|             |--CONSTRAINT--|
      (Vous pouvez aussi utiliser la commande Système WRKPFCST)

|

 Il est possible d'ajouter (ADD), retirer (DROP) ou de modifier (ALTER)   une colonne, modifiant ainsi la structure même de la table :
                                 ADD     ALTER TABLE nom-table-----< ALTER  >-COLUMN --------------->                                  DROP
 ADD COLUMN = même syntaxe que CREATE TABLE
     ADD COLUMN-nom-FOR COLUMN-nom/400---Définition------->
      >--------------------------------------------------->         !--NOT NULL-------------!         !--clause WITH DEFAULT--!
      >--------------------------------------------------------------------         !                                      ! !                        !         !--CONSTRAINT--nom---UNIQUE------------! !-BEFORE--nom-colonne(V7)!                            !-PRIMARY KEY----!                            !-REFERENCES ...-!

|

                                 !--CASCADE---!  DROP COLUMN-----nom de zone-----             !------                                  !--RESTRICT--!
      CASCADE indique que tous les logiques, toutes les vues toutes les        contraintes qui s'appuient sur cette colonne sont supprimées.
      RESTRICT indique que la colonne n'est pas retirée si un des éléments        ci-dessus s'appuie sur cette colonne.
 ALTER COLUMN ------------------------------------------------->                  !-SET ---DATA TYPE- type de zone---!                         !                         !                         !--NOT NULL---------------!
              >----DROP ---DEFAULT----------------------------->                          !           !                          !-NOT NULL--!
              >----(clause WITH DEFAUT)------------------.
 | 

   La TR2 de la version 7.2 apporte une option à CREATE TABLE

       CREATE OR REPLACE TABLE offrant les mêmes services que ALTER TABLE

       ON REPLACE

      PRESERVE ALL ROWS

       conservation de toutes les lignes, y compris sur une table

      PRESERVE ROWS (dft)

       si une plage (pour un table partitionnée) est enlevée, les lignes
      correspondantes disparaissent

      DELETE ROWS

       aucune ligne n'est conservée.  


D'ailleurs cette option est proposée par l'utilitaire permettant de retourver
le source SQL d'un objet PF ou TABLE (system i Navigator)


|

en V4R20 :
  On peut indiquer des contraintes de domaine :
   il s'agit de définir les valeurs pouvant être placées dans une colonne
      par exemple :
          CONSTRAINT service_valide   CHECK (service IN (10, 20, 30, 40))
     ce qui peut être indiqué par l'ordre SQL :

      ALTER TABLE personnel ADD CONSTRAINT salairecst               CHECK (salaire <  1000000 AND prime <= salaire)
      ou par la commande OS/400 :
      ADDPFCST FILE(personnel) TYPE(*CHKCST) CST(salairecst)                CHKCST('salaire < 1000000 AND prime <= salaire')

 

CREATE INDEX
|





         b) INDEX (Fichier logique même format avec clé)

         CREATE-(UNIQUE)-INDEX --nomindex-- ON -nomtable----

                             ----(CLE1 ---ASC---------------,
                                        I-DESC-I
                             -----CLE2 etc.....).

            UNIQUE a la même signification que UNIQUE SDD

            Pour chaque zone clé on peut définir un ordre de
            classement croissant ou décroissant.





         Les index sont de type b-tree.


|




                           +-------+
                  de A à N |AN - OZ| de O à Z
                           +-------+
                          /         \
                         /           \
                   +-------+
          de A à M |AM - N.| (tout ce qui est Nxxx)
                   +-------+
                  /         \
                            +------+ (tout ce qui est NAxxx)
                            |  A.  |       ____________
                            +------+       |TES=878787|      <-- NANTES
                           /        \    /
                                 +------+
                                 |  N.  |
                                 +-------  ____________
                                         \ |CY =124578|      <-- NANCY




|

Comment ignorer la différence minuscules/MAJUSCULES lors des recherches sur une chaîne avant la V6 :

1/ utiliser UCASE, par exemple : 

Select * from VINS where ucase(cepage) like 'CABERNET%'

le problème c'est que SQL ne peut réutiliser alors, aucun index existant.


2/ Utiliser un critère de tri particulier (paramètre SRTSEQ) : *LANGIDSHR

avec un séquence de tri à poids partagés, les caractères
a, A, â, ä, à (etc ...) ont  tous aux yeux de SQL, la même valeur héxadécimale, ce qui permet d'ignorer la casse ET l'accentuation.

--> Si vous avez créé un index avec les mêmes attributs, il est utilisé !


Un index est créé avec ces attributs, si :

a/ avec SDD, vous utilisez STRSEQ( ) et LANGID( ) sur la commande CRTLF

b/ sous SQL lors du CREATE INDEX, la session avait cette valeur en cours

Enfin, pour positionner ce paramètre sur la session SQL :
  • STRSQL STRSEQ(*LANGIDSHR) LANGID(FRA)
      -> identique avec RUNSQLSTM et les commandes de compilation

  • sous ODBC, paramétrez comme ceci


    ou bien, indiquez dans la chaine de connexion 
    • SORTTYPE=2
    • SORT WEIGTH=0
    • LANGUAGEID = 'FRA'

  • sous JDBC
    • sort = language
    • sort weigth = shared
    • sort language = FRA


|


 En V6, la création d'index subit de nombreux changements, les rendant    proches des fichiers logiques SDD (LF) et réglant le problème précédent.

 A/ On admet les expressions en tant que clé
    CREATE INDEX i1 on table T1 ( UCASE(NOM) as NOMMAJ )
 la zone NOMMAJ est la clé de cet index.
 toute requête utilisant WHERE UCASE(NOM) ..., utilisera l'index
 l'expression ne peut pas contenir :
   - des sous requêtes    - des fonctions agrégées (COUNT, AVG, SUM, etc ...)    - des fonctions NOT DETERMINISTIC (dont le résultat varie), comme       GENERATE_UNIQUE, CURTIME, DAYNAME, MONTHNAME, TIMESTAMPDIFF, etc...    - des UDF sauf celles liées à un nouveau type de données (UDT)    - la manipulation de SEQUENCE


|


 B/ On admet la clause WHERE sur les index :
    CREATE INDEX i1 on table T1 (NOM) WHERE NOM NOT LIKE 'VOL%'
    la clause WHERE subit les mêmes règles que les expressions

 C/ Vous pouvez préciser un format par la clause RCDFMT 
    suivi de la phrase suivante :
     ADD ALL COLUMNS : toutes les colonnes du PF appartiennent au format
     ADD KEYS ONLY   : seules les zones clés appartiennent au format
     ADD col1, col2  : ces zones font suite aux zones clés dans le format
 ATTENTION : la valeur par défaut est ADD KEYS ONLY               et le nom de format par défaut est le nom de l'INDEX              (avant l'index avait le même format que la table)

|
 Exemple récapitulatif :

  CREATE INDEX logi1 on HTTPLOG          ( SUBSTR(virtualhost, 1 , 10) VHOST2 )          Where virtualhost IS NOT NULL          RCDFMT httpfmt2 ADD host, logtime  -- en plus de VHOST2

  Ces index fonctionnent très bien quand il s'agit de retrouver un petit    nombre de clés dans un grand nombre d'enregistrements (accès RPG/COBOL)
  mais ils sont assez lents si vous réalisez une requête retournant 80 %    des enregistrements, particulièrement lors des tris.
  En effet les enregistrements doivent être retournés dans l'ordre des clés    et ils sont stockés dans physiquement sur le n° de RANG(dans la table)
  ==> Vous multipliez alors les E/S disque (sauf à utiliser RGZPFM)
  Ce sont les seuls utisables à la fois par SQL et par les langages      (RPG, COBOL) en acces direct.

|

 EVI enfin, qui est un concept Rochester (il y a un brevet), l'AS/400   étant le premier à l'utiliser.
 EVI est une utilisation avancèe des index Bitmap
                                                               Vecteur --------------------------                                  +-------------+ !rang   client   ville   !  ...........................     | code | rang | !------------------------!  : Table des symboles      :     +------+------+ !1  !   1     !  NANTES  !  :.........................:     |   1  |  1   | !2  !   6     !  ANGERS  !  :Valeur:code:Deb:Fin: nbre:     |   2  |  2   | !3  !   3     !  RENNES  !  :      :    :   :   :     :     |   3  |  3   | !4  !   7     !  CHOLET  !  :NANTES: 1  : 1 : 6 :  2  :     |   4  |  4   | !5  !   8     !  BREST   !  :ANGERS: 2  : 2 : 2 :  1  :     |   5  |  5   | !6  !   5     !  NANTES  !  :RENNES: 3  : 3 : 7 :  2  :     |   1  |  6   | !7  !   4     !  RENNES  !  :CHOLET: 4  : 4 : 4 :  1  :     |   3  |  7   | !8  !   2     !  VANNES  !  :BREST : 5  : 5 : 5 :  1  :     |   6  |  8   | !   !         !          !  :VANNES: 6  : 8 : 8 :  1  :     +-------------+ !------------------------!  :......:....:...:...:.....:


|

  Le vecteur contient un poste par enregistrement, la position donnant le     n° de rang, MAIS on indique un code et non une valeur de clé.

    On indique en plus une table des symboles qui contient
       - la correspondance entre chaque valeur de clé et son code associé
       - des statistiques destinées au "Query Governor" l'optimiseur de                                                                      requête
    Il faut simplement indiquer le nombre de valeurs différentes lors de la      création afin de savoir s'il faut créér un vecteur sur 1,2 ou 4 octets
    si vous ne connaissez pas ce nombre de valeurs différentes SQL va les        rechercher pour vous et la création de l'index sera un peu plus longu
       CREATE ENCODED VECTOR INDEX on fichier(clé1, clé2, ...)
                      FOR x DICTINCT VALUES 

|

 V7
 - Les index avec sélection d'enregistrement(avec une clause WHERE)     sont maintenant pleinement utilisés par le moteur SQL (SQE)

 - possibilité d'inclure des fonctions agrégées (SUM,AVG,COUNT,VAR,STDDEV)     dans un index EVI.

     CREATE ENCODED VECTOR INDEX EVI01 ON COMMANDES        (DATCMD, FAM)              INCLUDE (SUM(QTE) , COUNT(*) )

     Avec le groupe PTF SF99701 level 18, les requêtes utilisant        GROUPING SET, ROLLUP ou CUBE, bénéficient aussi de ce type d'index.


CREATE VIEW
|




         c) VIEW  (Fichier logique format différent)                   (Projection , Sélection, jonction)

         CREATE--VIEW -nomvue----------------------------------                               I-nom-colonne1, nom-colonne2,-I
          >--------------(AS SELECT ...FROM ... WHERE ....[cf SELECT]-
          >-----------------------------------------------------------                |                                |                |      |-CASCADED-|              |                |-WITH ----------- CHECK OPTION--|                |      |-LOCAL----|              |
     La déclaration des noms de colonnes est obligatoire si une      colonne est définie 2 fois (jonction) ou n'est pas définie      (résultat d'un calcul ou d'une expression).


|

     WITH CHECK OPTION :
                 la clause WHERE doit être vérifiée aussi pour                   les mises à jour et les insertions.
                 Si vous faites une restriction sur le code société = 01                   l'utilisateur ne peut pas insérer(par exemple) des                   lignes d'une autre société.

 SQL autorise des vues s'appuyant sur des vues 
      CREATE TABLE t1 ....       CREATE VIEW v1 (AS SELECT ... FROM t1 ....)       CREATE VIEW v2 (AS SELECT ... FROM v1 ....)
 avec CASCADED le contrôle est effectué AUSSI par rapport aux sélections   de TOUTES les vues sous-jacentes (utilisées dans FROM).
 avec LOCAL le contrôle n'est effectué que pour les vues sous-jacentes ayant   elles même la clause WITH CHECK OPTION.

CREATE ALIAS
|



         d) ALIAS (autre nom d'un fichier ou qualification d'un membre)
                        nouveauté liée à la version 4.30.
 - gestion des ALIAS
   un ALIAS permet de renommer un fichier (lui donner un nom long)
   ou préciser un membre pour un fichier multi-membres.

 CREATE ALIAS MABIB/MBR2_ALIAS FOR MABIB/FIC1P1 (MBR2)
 mettre à jour MBR2_ALIAS revient à mettre à jour MBR2 dans FIC1P1
 ATTTENTION : DROP TABLE nom-alias détruit le fichier PHYSIQUE
             il faut écrire DROP ALIAS pour supprimer l'ALIAS
             Un alias portant sur un fichier inconnu, peut exister.

|

   Limitations :
   + n'est pas supporté pas ALTER TABLE, si c'est un ALIAS de membre.
   + n'est pas supporté par la clause FOREIGN KEY (int. référentielle),       si c'est un ALIAS de membre.
   + CREATE TABLE ne peut pas créer une table ayant le même nom qu'un alias
   + idem pour CREATE INDEX et CREATE VIEW.
   + DROP TABLE, GRANT et REVOKE ne sont pas admis pour un alias de membre


   on entend par ALIAS de membre, un alias indiquant un membre particulier

Variables globales

|


         e) Variable globale
  on peut maintenant( V7.1), créer des variables globales
  elles sont stockées en fait dans des programmes de service (*SRVPGM)    accessibles par toute personne ayant les droits sur l'objet.   le contenu est propre à la session .
 Exemple:
 CREATE VARIABLE profil CHAR(10) DEFAULT 'QSECOFR'
  la variable PROFIL sera créé pour tous les travaux du système et    contiendra QSECOFR.
   VALUES profil , permet de l'afficher.
   VALUES 'CM' INTO PROFIL (ou bien SET), change son contenu pour le job
   la variable est initialisée en début de job, et seul le job peut la     modifier. On dit que la "portée" est limité à la session.

|

 une variable peut être utilisée dans un trigger et dans une vue :
  CREATE VIEW  admin as (select * from mesuser where nom = PROFIL)
   select * from admin --> montre QSECOFR
   set PROFIL = 'CM'    select * from admin --> montre CM
 une variable peut être initialisée avec une autre variable
 CREATE VARIABLE unprofil CHAR(10) DEFAULT PROFIL
 le contenu initial de la variable (DEFAULT) peut être une valeur retournée   par un SELECT
   CREATE VARIABLE nbrdeproducteurs INTEGER DEFAULT      (SELECT COUNT(*) FROM PRODUCTEURS)
 Créer une variable = créer un programme de service qui peut être sauvegardé    et restauré.Elle est enregistrée dans SYSVARIABLES et SYSVARIABLEDEP.

Mise à jour du catalogue
|


      3/ MISE A JOUR DU CATALOGUE SQL
           a/ mise à jour des labels

             LABEL ON TABLE    STGTBL IS 'Fichier des stagiaires'                       PACKAGE                    (==> modification du texte de l'objet)
             LABEL ON STGTBL                    (NUMSTG IS 'n° de stagiaire',                     NOM    IS 'nom du stagiaire',                     PRENOM IS 'prénom du stagiaire')
             LABEL ON COLUMN STGTBL.AGENCE                            IS 'n° agence    '       [==> COLHDG]

             LABEL ON COLUMN STGTBL.AGENCE                            TEXT IS 'numéro agence'  [==> TEXT)]

|

 V5R40       LABEL ON INDEX  STGTBLI1 IS 'index par nom'
 V6R10       LABEL ON CONSTRAINT                       FUNCTION                       PROCEDURE                       TRIGGER                       TYPE
           b/ mise à jour des commentaires

             COMMENT ON ....

           + mise à jour des commentaires dans les catalogues SQL                    (==> uniquement la zone REMARKS du catalogue)
             même syntaxe que l'ordre LABEL ON , plus
              PROCEDURE nom IS ....                  catalogue SYSPROCS               PARAMETRE procedure.paramètre IS ....  catalogue SYSPARMS


 

Droits
|



      4/ GESTION DES AUTORISATIONS

         ACCORDER DES DROITS

                  I ---ALL------(tous les droits)---I
                  I ---ALTER----(*OBJALTER)---------I
                  I ---DELETE---(*OBJOPR + *DELETE)-I
         GRANT ---I ---INDEX----(*OBJMGT)-----------I-------->
                  I ---INSERT---(*OBJOPR + *ADD)----I
                  I ---SELECT---(*OBJOPR + *READ)---I
                  I ---UPDATE---(*OBJOPR + *UPD)----I
                  I ---REFERENCE(*OBJREF)-----------I

          ----- ON nom(de table ou de vue)------------------->

          ----- TO -nomprofil------(1 profil utilisateur)---->
                   I-PUBLIC----I   (*PUBLIC)

          -------------------------------------------------.
           I---WITH GRANT AUTORITY---I (donne le droit de gérer les droits)

|


      4/ GESTION DES AUTORISATIONS

         REVOQUER DES DROITS

                  I ---ALL------(tous les droits)---I
                  I ---ALTER----(*OBJALTER)---------I
                  I ---DELETE---(*OBJOPR + *DELETE)-I
         REVOKE --I ---INDEX----(*OBJMGT)-----------I--------
                  I ---INSERT---(*OBJOPR + *ADD)----I
                  I ---SELECT---(*OBJOPR + *READ)---I
                  I ---UPDATE---(*OBJOPR + *UPD)----I
                  I ---REFERENCE(*OBJREF)-----------I

          ----- ON nom(de table ou de vue)-----



          --- FROM -nomprofil---.  (1 profil utilisateur)
                   I-PUBLIC----I   (*PUBLIC)





|


      4/ GESTION DES AUTORISATIONS à la colonne .

         Depuis la V4R2 il est possible de gérer les droits à la colonne :



           GRANT
            SELECT ,
            UPDATE(numtel,email)
           ON TABLE personnel
           TO richard



           ici, on donne le droit de lectures (toutes colonnes) et le droit
            de modifier les colonnes "numtel" et "email" uniquement.



           les droits ne sont accordés que via SQL mais peuvent être
             visualisés par DSPOBJAUT, EDTOBJAUT puis F16.

           Ils sont modifiables aussi par OPERATION NAVIGATOR.


Divers

|



      5/ GESTION DES VERROUILLAGES  (libération lors du COMMIT)

          LOCK TABLE -nomtable- IN --SHARE------- MODE 
                                   I-EXCLUSIVE--I



                                   SHARE     =  ALCOBJ  *SHRNUP
                                   EXCLUSIVE =  ALCOBJ  *EXCL



      6/ SUPPRIMER

                 I----TABLE----I
          DROP --I----VIEW-----I---nomobjet.
                 I----INDEX----I
                 I--COLLECTION-I
                 I---PACKAGE---I
                 I----ALIAS----I

        ATTENTION: Si vous supprimez une table, SQL supprime de
         lui-même tous les index et les vues en relation.

|




      8/ Renommer





                  --- TABLE (nom de table ou de vue)--
         RENAME --                                      ---->
                  --- INDEX (nom d'index)--------------



                >-- TO --- (nouveau-nom)-------------------------------
                       |         |                               |  |
                       |         |--FOR SYSTEM NAME (nom OS/400)-|  |
                       |                                            |
                       |--SYSTEM NAME (nouveau-nom-OS/400)----------











|

    CATALOGUE SQL  (dans QSYS2)
   SYSTABLES        ! une ligne par table/PF    SYSCOLUMNS       ! une ligne par colonne de fichier    SYSCST           ! contraintes    SYSKEYCST        ! clés de contraintes (UNIQUE et Primary KEY)    SYSREFCST        ! contraintes de type RI    SYSCSTCOL        ! colonnes de contraintes RI    SYSCSTDEP        ! dépendance parent/enfant (RI)    SYSCHKCST        ! contraintes de type CHECK

   SYSINDEXES       ! une ligne par index    SYSKEYS          ! une ligne par clé d'index    SYSVIEWS         ! une ligne par vue    SYSVIEWDEP       ! dépendance  table/PF -> vue

   SYSLANGS         ! compatibilité avec norme ISO (niveau supporté)    SYSPACKAGE       ! package SQL (DRDA)

|

   SYSPROCS         ! une ligne par procédure cataloguée.    SYSPARMS         ! une ligne par paramètre de procédure    SYSFUNCS         ! une ligne par fonction (V4R40)    SYSROUTINE       ! contient l'ensemble des routines SQL (proc+fonctions)
   SYSTYPES         ! une ligne par type créé par l'utilisateur    SYSTRIGGER       ! une ligne par Trigger    SYSSEQ           ! une ligne par SEQUENCE (V5R30)  -------------------------------------------------------------------------- les fichiers suivants du catalogues SQL sont nouveaux en V6R10
  statistiques sur l'activité des tables    SYSCOLUMNSTAT              SYSPACKAGESTAT    SYSINDEXSTAT               SYSPROGRAMSTAT    SYSMQTSTAT                 SYSTABLEINDEXSTAT    SYSTABLESTAT   sur les partitions (membre en langage SQL)    SYSPARTITIONSTAT           SYSPARTITIONINDEXES    SYSPARTITIONMQT            SYSPARTITIONINDEXSTAT   enfin une ligne par bibliothèque    SYSSCHEMAS


II/ Outils de conception de la base.


|

1/ en mode caractère (Terminal 5250)



    IMPORTATION / EXPORTATION


      CPYTOIMPF (copy to imported file)
 et
       CPYFRMIMPF (from imported file)



  permettent l'importation/exportation de fichiers physiques de/vers des
   fichiers à plat avec séparateurs (type CSV).

le principe est de générer un fichier "à plat" à partir d'un fichier BD
  (CPYTOIMPF)

 ou d'insérer des lignes venant d'une autre base (CPYFRMIMPF)



la fonction CPYTOIMPF génère un fichier type CSV dans IFS.





                    Copier dans fich importation (CPYTOIMPF)

 Indiquez vos choix, puis appuyez sur ENTREE.

 Fichier d'origine:
   Fichier  . . . . . . . . . . . > AF4MBRP1      Nom
     Bibliothèque . . . . . . . . >   AF400       Nom, *LIBL, *CURLIB
   Membre . . . . . . . . . . . .   *FIRST        Nom, *FIRST
 Fichier BD de destination:
   Fichier  . . . . . . . . . . .                 Nom
     Bibliothèque . . . . . . . .     *LIBL       Nom, *LIBL, *CURLIB
   Membre . . . . . . . . . . . .   *FIRST        Nom, *FIRST
 Fichier STREAM de destination  . > '/dbfimport/af400bis'                   
                                 
 Remplacement ou ajout enregs . .   *ADD          *ADD, *REPLACE

 Cela ressemble à une commande Copie (CPYF), mais :

          vers un fichier en interne      TOFILE
     OU   vers un fichier "PC"            TOSTMF




viennent ensuite les critères de séparateurs et de format :

 Délimiteur d'enregistrement  . . > *CRLF         Valeur alpha, *EOR, *CRLF.
 Format fichier d'importation . .   *DLM          *DLM, *FIXED
 Délimiteur de chaîne . . . . . .   '"'           Valeur alpha, *NONE
 Délimiteur de zone . . . . . . .   ','           Valeur alpha
 Indicateur de zone indéfinie . .   *NO           *NO, *YES
 Symbole décimal  . . . . . . . .   *PERIOD       *PERIOD, *COMMA
 Format de date . . . . . . . . .   *ISO          *ISO, *USA, *EUR, *JIS, *Y
 Format d'heure . . . . . . . . .   *ISO          *ISO, *USA, *EUR, *JIS

depuis la V5R10 :

STMFCODPAG = pour le choix du code page lors des exportations.

              *PCASCII  = 1252 => l'ANSI de MS-Windows
              *STDASCII =  850 => l'ASCII DOS.
 RPLNULVAL  = remplace les valeurs nulles par les valeurs par défaut.

la commande d'importation (CPYFRMIMPF) fonctionne sur le même modèle


|
2/ tapez vos scripts dans un membre source

EN version 6, RUNSQLSTM admet un paramètre SRCSTMF indiquant les coordonnées d'un fichier dans l'IFS plutôt qu'un membre source.

|

3/ avec Operation Navigator

Avec choix des bibliothèques à afficher, choisissez les schémas avec lesquels vous souhaitez travailler.

vous verrez apparaitre la liste des catégories :


En mode assistance, cliquez avec le bouton droit : "nouveau/table"



Indiquez ici le nom de la table et le texte associé (50c disponible pour CHAQUE Objet OS/400)



Le deuxième onglet permet la définition des colonnes de cette table



notre définition de table terminée, passons aux onglets contraintes :




le bouton "affichage du code SQL" affiche le code généré, dans le gestionnaire de scripts (voir plus loin)


Une fois la création demandée, nous pouvons retrouver le code à partir du catalogue SQL.

Il sera affiché dans le même produit (gestionnaire de scripts)

 


• Gestion des index

Vous pouvez demander la liste des index pour un bibliothèque entière en cliquant sur Tables, ou bien, table par table

cette liste des index affiche les informations nouvelles en V6

-> clé basée sur une expression

-> clause WHERE de sélection de lignes

Bien sur, la fenêtre de création d'index a été modifiée dans ce sens

et


pour la création de vues, les fenêtres suivantes vous sont affichées jusqu'en Version 7 de Client Access:


En V7R10, vous retrouverez une fenêtre plus proche du CREATE TABLE

Mais permettant de lancer l'assistant et de visualiser le résultat du SELECT


Une fois la base créée, System i Navigator permet une administration complète

Avec l'option Ouverture, vous pourrez éditer son contenu (Edition en V6),

Affichage des contraintes, comme WRKPFCST (V5R30 uniquement)


Avec activation/ désactivation possible (CHGPFCST...)


et liste des contraintes en erreur (au niveau du système)



• collecte de statistiques (nouveauté de DB2/400 V5R20 orientée performances)


Affichage des index liés à une table (click droit sur la table)

Cette dernière option vous affiche des informations nouvelles en V5R30 concernant l'utilisation des index

En effet, la date de dernière utilisation de l'objet fichier logique, n'est pas significative dans le cas d'une requête SQL,
où c'est l'optimiseur qui décide de l'utilisation ou non de l'index (utilisation non explicite).

Les PTF suivantes : SI12938, SI15255, SI13432, SI13245 ET SI16620 (en France) apportent 4 nouvelles colonnes


 

• DataBase navigator permet d'avoir une vision d'ensemble des liens existant entre fichiers (si intégrité référentielle)

création d' un nouvel organigramme :

Dans la partie gauche de la fenêtre, il faut renseigner la bibliothèque et choisir "recherche" pour réactualiser la liste.

la liste des tables vous est affichée et pour chaque table, les relations base de données
(liste des index, liste des vues)

L'option ajout à l'organigramme, ajoute cette table et toutes les tables liées à l'organigramme

 

vous pouvez demander l'affichage ou le retrait des éléments suivants (dans l'ordre) :

  • les index
  • les vues
  • les journaux
  • les récepteurs de journaux
  • les contraintes de clé primaire
  • les contraintes de vérification (CHECK)
  • les contraintes de clé unique
  • les alias de table
  • et enfin, les alias de vue.

Enfin, vous pouvez lancer "à la main" le gestionnaire de scripts ou CWBUNDBS.EXE

==> sur le nom de votre système, click droit, puis Exécution  de scripts SQL.




Vous pourrez :

 

Vous pouvez aussi insérer des commandes systèmes en commencant votre ligne par CL:

la V5R20 apporte une aide précieuse à la saisie d'un ordre SQL par F4.



Le gestionnaire de script subit encore de nombreux changements en version 6

1/ une option ALLOW SAVE RESULT, permet la sauvegarde des enregistrements extraits:

ensuite, avec un clic droit sur les lignes affichées :


Les formats admis, sont :

Les paramètres de connexion (JDBC) peuvent être modifiés temporairement ou définitivement

et proposent maintenant l'affichage des COLHDG plutôt que les noms de zone en entête de colonne


La(les) requêtes(s) peuvent être sauvegardée(s) sur le serveur (fichier physique ou IFS)

Ce qui accompagne très bien le nouveau paramètre SRCSTMF de la commande RUNSQLSTM

 

Enfin, Vous pourrez, aussi , obtenir des informations d'optimisation sur votre requête (VISUAL EXPLAIN)

en V6, Visual Explain peut être lancé et réactualisé, pendant l'exécution, les informations ayant bougé sont surlignées.

le Menu Option propose

 



Pour une surveillance globale des performances base de données, vous aurez le choix entre :

1/ le moniteur de perf. Base de données

cliquez sur moniteur de Base de données / nouveau ...




remarquez :


Choix des travaux (comme en V5R30)

 

Quand la trace est terminée (l'arrêt est à votre charge), choisissez une vue (les données à afficher)



il s'agit en fait d'ordres SQL, lancés sur les fichiers stockés dans la bibliothèque choisie au début du paramétrage
.



2/ l'analyse du cache des plans d'accès SQL

Pour chaque instruction, vous pouvez voir le "plan d'accès" par Visual Explain.


et enfin, nous pouvons demander à voir les recommandation faites pendant la constitution de ce cache.

Depuis la V5R40, le système note les index qui lui paraissent manquant dans QSYS2/SYSIXADV.




Le contenu de ce fichier est affiché par cette option "Assistant de gestion des index" d'iSeries navigator



Avec SF99540 (Groupe database,) niveau 4 en V5R30 ou + , le système créé lui même sous forme d'index temporaires, les index qu'il juge nécessaires.

(fonction MTI soit Maintained Tempory Indexes), ces index disparaissent à l'IPL.

la nouveauté se trouve tout à droite de cette fenêtre


- Affichage de l'instruction SQL est nouveau en V6

- ainsi que l'accès direct aux instructions qui ont provoqué cette suggestion (dans le cache, voir ci-dessous)

- l'assistant affiche aussi le nombre de fois ou un index a été suggéré et, s'il a été créé automatiquement (MTI), le nombre de fois ou il a été utilisé

Ce compteur peut-être réinitialisé pour la table, par le menu contextuel suivant :

Copyright © 1995,2011 VOLUBIS