Blog d'un DBA sur le SGBD Oracle et SQL

19 mars 2017

Taille d'une table et réutilisation des blocs de données suite à Insert, Delete, Truncate, Drop Table, Shrink, Move

         
Introduction
Une légende tenace dans le monde Oracle dit qu'une fois les données d'une table supprimées, l'espace occupé par ces lignes est définitivement perdu! Oui, ça a l'air idiot mais on trouve encore cette histoire sur pas mal de forums.

La réalité est plus complexe : une fois que des blocs de données ont été alloués à une table, ces blocs restent alloués à la table, même si l'intégralité des données est supprimée par un DELETE! Néanmoins ces blocs seront réutilisables lors des INSERT suivants.

Si on souhaite libérer ces anciens blocs, il existe plusieurs méthodes :
          - TRUNCATE TABLE
          - DROP TABLE
          - ALTER TABLE ... SHRINK
          -
ALTER TABLE ... MOVE



Points d'attention
Si vous ne reconstruisez pas régulièrement vos tables, vous risquez de perdre beaucoup d'espace disque, voir de remplir votre tablespace de données avec des tables vides... Autre point : cet article traite des tables mais les index eux aussi doivent être régulièrement reconstruits suite à des DELETE.On termine avec le fait que si un MOVE ou un SHRINK a été effectué sur une table, il faut régénérer les index car ils sont invalidés; en effet, les rowid des index ne sont plus pertinents puisque les données dans les tables se sont déplacées :-)



Base de tests
N'importe quelle base Oracle.

 



Exemples
============================================================================================
Créer une table avec 290 000 enregistrements.

============================================================================================
Etat de la base avant la création de la table de test.
Mon tablespace de données, appelé USERS, fait seulement 1.94 Mo.
          SQL> SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_SEGMENTS GROUP BY TABLESPACE_NAME

          UNION
          SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME
          ORDER BY 1;

          TABLESPACE_NAME          TAILLE Mo
          ----------------------------------------------------------
          SYSAUX                            583,25
          SYSTEM                           687,875
          TEMP                                 29
          UNDOTBS1                           9,625
          USERS                                 1,9375

Création de la table de test.
On crée une table de test en choisissant de dupliquer la table DBA_OBJECTS et d'y copier quatre fois les mêmes données.
          SQL> CREATE TABLE T_OBJECTS02 AS SELECT * FROM DBA_OBJECTS;
          Table créée.

          SQL> select count(*) from T_OBJECTS02;
          COUNT(*)
          ----------
          72007

          SQL> INSERT INTO T_OBJECTS02 SELECT * FROM T_OBJECTS02;
          72007 ligne(s) créée(s).

          SQL> /
          144014 ligne(s) créée(s).

          SQL> select count(*) from T_OBJECTS02;
          COUNT(*)
          ----------
          288028

Espace disque occupé par la nouvelle table.
          SQL> SELECT SEGMENT_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE EN MO" FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
          SEGMENT_NAME        TAILLE EN MO
          ----------------------------------------------------------
          T_OBJECTS02                     33

Nombre de blocs dans la table.
          SQL> SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
          SEGMENT_NAME         SUM(BLOCKS)
          -------------------------------------------------------------
          T_OBJECTS02                   4224

Le DB_BLOCK_SIZE faisant 8K (8192 bytes en réalité), nous avons bien pour 4224 blocs, une taille total de 34,6 Mo mais arrondi à 33 Mo dans le calcul plus haut.


============================================================================================
DELETE de 90% de la table : espace non récupéré

============================================================================================

Nous allons maintenant effectuer un DELETE de 90% des données de la table.
          SQL> DELETE FROM T_OBJECTS02 WHERE ROWNUM < 260001;
          260000 LIGNE(S) SUPPRIMEE(S).

Il ne reste plus que 28000 enregistrements sur 288028 soit 10%.
          SQL> SELECT COUNT(*) FROM T_OBJECTS02;
          COUNT(*)
          ----------
          28028

Espace disque occupé par la table après le DELETE.

          SQL> SELECT SEGMENT_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE EN MO" FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
          SEGMENT_NAME         TAILLE EN MO
          ----------------------------------------------------------
          T_OBJECTS02                 33

Nombre de blocs dans la table après le DELETE.
          SQL> SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
         SEGMENT_NAME        SUM(BLOCKS)
         ------------------------------------------------------------
         T_OBJECTS02                 4224

On voit bien que le DELETE de 90% de la table n'a rien changé à l'espace disque occupé par la table ni au nombre de blocs qui lui est affecté. Pour quelle raison? Tout simplement parce qu'Oracle a associé ces blocs au segment de la table T_OBJECTS02, qu'ils soient remplis ou vides, et qu'il ne les libérera que dans certaines circonstances qu'on verra plus bas.

Cela vous choque? C'est pourtant ce qui se passe quand, sous Windows, on supprime un fichier de plusieurs gigas et qu'on constate que l'espace disque n'est pas récupéré. Windows a mis le fichier dans la corbeille et on est obligé de vider celle-ci pour réellement récupérer l'espace du fichier supprimé. Oracle est a peu près dans la même philosophie : pour récupérer l'espace disque, vous devez faire une action spécifique et ce n'est pas un DELETE suivi d'un COMMIT mais plutôt un TRUNCATE, MOVE, SHRINK, DROP.


============================================================================================
INSERT de 260000 enregistrements : les anciens blocs sont réutilisés

============================================================================================

Nous allons maintenant prouver que suite à un DELETE, les blocs de données vidés précédemment (en totalité ou partiellement) sont réutilisés lors d'un INSERT.

Nous supprimons d'abord tous les enregistrements de la table pour ensuite alimenter la table comme dans le premier test.
          SQL> delete from t_objects02;
          28028 ligne(s) supprimée(s).

          SQL> commit;
          Validation effectuée.

          SQL> select * from t_objects02;
          aucune ligne sélectionnée

Même vide, la table continue d'occuper les 4224 blocs du départ.
          SQL> SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY                      SEGMENT_NAME;
          SEGMENT_NAME          SUM(BLOCKS)
          -----------------------------------------------------------
          T_OBJECTS02                   4224

On réinsère 300 000 enregistrements dans la table de tests.
          SQL> INSERT INTO T_OBJECTS02 SELECT * FROM dba_objects;
          72007 ligne(s) créée(s).

          SQL> INSERT INTO T_OBJECTS02 SELECT * FROM T_OBJECTS02;
          72007 ligne(s) créée(s).

          SQL> /
          144014 ligne(s) créée(s).

          SQL> COMMIT;
          Validation effectuée.

          SQL> SELECT COUNT(*) FROM T_OBJECTS02;
          COUNT(*)
          ----------
          288028

On voit que la table occupe le même nombre de mégas et, surtout, le même nombre de blocs! Ce qui prouve bien que les blocs alloués à la table lors des premiers INSERT le sont restés après le DELETE et qu'ils ont été réutilisés lors des derniers INSERT.
          SQL> SELECT SEGMENT_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE EN MO" FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
          SEGMENT_NAME          TAILLE EN MO
          -----------------------------------------------------------
          T_OBJECTS02                     33

          SQL> SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
          SEGMENT_NAME          SUM(BLOCKS)
          -------------------------------------------------------------
          T_OBJECTS02                    4224

Regardons la taille des tablespaces. Elle nous confirme ce qu'on vient de voir, soit que même si on a généré 66 Mo lors des deux INSERT, seuls 33 Mo ont été ajoutés au TBS USERS. Au départ celui-ci faisait 1,9375 Mo et maintenant il fait 34.9375 Mo.
         SQL> SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_SEGMENTS GROUP BY TABLESPACE_NAME
         UNION
         SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME
         ORDER BY 1;

        TABLESPACE_NAME         TAILLE MO
        ----------------------------------------------------------
        SYSAUX                              584,4375
        SYSTEM                             687,875
        TEMP                                   29
        UNDOTBS1                           20,3125
        USERS                                 34,9375


============================================================================================
TRUNCATE de la table : l'espace est libéré.

============================================================================================

Nous allons maintenant faire un TRUNCATE pour voir si l'espace disque est complètement rendu à Oracle ou s'il reste lié à la table.

Le résultat du test est clair : l'espace est quasiment rendu à Oracle, même s'il reste 8 blocks occupant 0.625 Mo.

        SQL> TRUNCATE TABLE T_OBJECTS02;
        Table tronquée.

        SQL> SELECT SEGMENT_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE EN MO" FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
        SEGMENT_NAME          TAILLE EN MO
        -----------------------------------------------------------
        T_OBJECTS02                     ,0625

        SQL> SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
        SEGMENT_NAME          SUM(BLOCKS)
        ------------------------------------------------------------
        T_OBJECTS02                       8

        SQL> SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_SEGMENTS GROUP BY TABLESPACE_NAME
        UNION
        SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME
        ORDER BY 1;
        TABLESPACE_NAME          TAILLE MO
        ------------------------------------------------------------
        SYSAUX                              584,4375
        SYSTEM                             687,875
        TEMP                                   29
        UNDOTBS1                           20,3125
        USERS                                  2


============================================================================================
DROP de la table : l'espace n'est pas libéré!

============================================================================================

Nous allons maintenant tester le DROP TABLE. Solution extrême mais quand une table ne sert plus à rien, autant la supprimer.

Nous remplissons à nouveau notre table, nous la supprimons et là, surprise!!!!! le tablespace USERS n'a pas relaché la taille occupée par la table supprimée! Pourtant il ne reste plus aucun bloc associé à la table...

       SQL> INSERT INTO T_OBJECTS02 SELECT * FROM dba_objects;
       72007 ligne(s) créée(s).

       SQL> INSERT INTO T_OBJECTS02 SELECT * FROM T_OBJECTS02;
       72007 ligne(s) créée(s).

       SQL> /
       144014 ligne(s) créée(s).

       SQL> commit;
       Validation effectuée.

       SQL> select count(*) from t_objects02;
       COUNT(*)
       ----------
       288028

       SQL>  SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
       SEGMENT_NAME          SUM(BLOCKS)
       --------------------------------------------------------------
       T_OBJECTS02                 4224

       SQL> SELECT SEGMENT_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE EN MO" FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
       SEGMENT_NAME              TAILLE EN MO
       -------------------------------------------------------------------
       T_OBJECTS02                           33

Nous supprimons maintenant la table.
       SQL> DROP TABLE T_OBJECTS02;
       Table supprimée.

       SQL> SELECT SEGMENT_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE EN MO" FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
       aucune ligne sélectionnée

       SQL>  SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
       aucune ligne sélectionnée

       SQL> SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_SEGMENTS GROUP BY TABLESPACE_NAME
                 UNION
                 SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME
                 ORDER BY 1;
       TABLESPACE_NAME                 TAILLE MO
       --------------------------------------------------------------------
       SYSAUX                                         588,75
       SYSTEM                                         687,875
       TEMP                                               29
       UNDOTBS1                                       20,25
       USERS                                             34,9375

L'espace n'est pas récupéré mais l'explication est toute bête : la table droppée est copiée dans la corbeille Oracle appelée RECYCLEBIN et donc elle existe toujours sur le disque dur, au cas où on voudrait la récupérer. Nous allons donc vider cette corbeille et voir si l'espace de la table est bien rendu à Oracle. Bien sur, si vous avez configuré votre base pour ne pas avoir de RECYCLEBIN, l'espace est libéré de suite avec le DROP TABLE. L'autre solution consiste à faire un DROP TABLE ma_table PURGE pour supprimer vraiment la table.
       SQL> select * from cat;
       TABLE_NAME                                           TABLE_TYPE
       -----------------------------------------------------------------------------------
       BIN$MdxPtbEdRcaYummc7uUxOg==$0        TABLE   -- les objets mis dans le RECYCLEBIN ont un nom très bizarre
       COUNTRIES                                                TABLE
       DEPARTMENTS                                          TABLE
       DEPARTMENTS_SEQ                                  SEQUENCE
       EMP                                                           TABLE
       EMPLOYEES                                              TABLE
       EMPLOYEES_SEQ                                     SEQUENCE
       EMP_DETAILS_VIEW                                  VIEW
       JOBS                                                          TABLE
       JOB_HISTORY                                            TABLE
       LOCATIONS                                                TABLE
       LOCATIONS_SEQ                                        SEQUENCE
       REGIONS                                                    TABLE
       13 ligne(s) sélectionnée(s).

       SQL> purge recyclebin ;
       Corbeille purgée.

       SQL> SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_SEGMENTS GROUP BY TABLESPACE_NAME
       UNION
       SELECT TABLESPACE_NAME, SUM(BYTES)/(1024*1024) AS "TAILLE MO" FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME
       ORDER BY 1;
       TABLESPACE_NAME        TAILLE MO
       ---------------------------------------------------------
       SYSAUX                             589,0625
       SYSTEM                            687,875
       TEMP                                  29
       UNDOTBS1                          20,25
       USERS                                 1,9375

OK, l'explication était la bonne! Nous avons récupéré l'intégralité des blocs alloués à la table puisque nous avons le même espace disque pour le TBS USERS qu'avant la création de la table.


============================================================================================
MOVE ET SHRINK de la table : l'espace est libéré!

============================================================================================

Nous avons vu que TRUNCATE TABLE et DROP TABLE ma_table PURGE permettaient de rendre à Oracle les blocs occupés par la table mais il s'agit là de commandes à utiliser en dernier recours. Pour juste récupérer les blocs perdus lors d'un DELETE, nous allons réorganiser notre table via un MOVE ou un SHRINK; il s'agit là des commandes Oracle prévues à cet effet.

Attention, une fois un MOVE ou un SHRINK effectués sur une table, il faut régénérer ses index. Ceux-ci ont été invalidés car les rowid des index ne sont plus pertinents par rapport à l'emplacement des données puisqu'elles ont été déplacées (elles ont donc un nouveau ROWID).

Nous testons d'abord le MOVE.
          SQL> CREATE TABLE T_OBJECTS02 AS SELECT * FROM DBA_OBJECTS;
          Table créée.

          SQL> select count(*) from T_OBJECTS02;
          COUNT(*)
          ----------
          72007

          SQL> INSERT INTO T_OBJECTS02 SELECT * FROM T_OBJECTS02;
          72007 ligne(s) créée(s).

          SQL> /
          144014 ligne(s) créée(s).

          SQL> select count(*) from T_OBJECTS02;
          COUNT(*)
          ----------
          288028

          SQL> DELETE FROM T_OBJECTS02 WHERE ROWNUM < 260001;
          260000 LIGNE(S) SUPPRIMEE(S).

          SQL>  SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
          SEGMENT_NAME          SUM(BLOCKS)
          --------------------------------------------------------------
          T_OBJECTS02                 4224

          SQL> ALTER TABLE T_OBJECTS02 MOVE;
          Table modifiée.

          SQL> SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
          SEGMENT_NAME                 SUM(BLOCKS)
          ---------------------------------------------------------------------------
          T_OBJECTS02                             512

Bingo!  Nous sommes passés de 4224 blocs à seulement 512! La table a bien été réorganisée. On notera quand même que 260 000 lignes sur 288 000 représente 90% de la table supprimée. Pourtant, nous avons 512 blocs au lieu de 422 (10% de 4224) après le MOVE. A quoi servent ces 90 blocs en plus? Nous dirons que le MOVE est bien mais qu'il ne peut pas réorganiser en totalité la table, il a donc ses imperfections que le SHRINK vient corriger.


Nous allons maintenant tester le SHRINK pour voir s'il est plus performant que le MOVE.
Nous droppons la table, la recréons et la remplissons comme dans les tests précédents.
         SQL> drop table T_OBJECTS02 purge;
         Table supprimée.

         SQL> CREATE TABLE T_OBJECTS02 AS SELECT * FROM DBA_OBJECTS;
         Table créée.

         SQL> INSERT INTO T_OBJECTS02 SELECT * FROM T_OBJECTS02;
         72007 ligne(s) créée(s).

         SQL> /
         144014 ligne(s) créée(s).

         SQL> commit;
         Validation effectuée.

         SQL> DELETE FROM T_OBJECTS02 WHERE ROWNUM < 260001;
         260000 LIGNE(S) SUPPRIMEE(S).

         SQL> commit;
         Validation effectuée.

Pour pouvoir utiliser la fonction SHRINK, il faut que pour la table l'option ROW MOVEMENT soit activée.
        SQL> alter table T_OBJECTS02 ENABLE ROW MOVEMENT;
        Table modifiée.

        SQL> ALTER TABLE T_OBJECTS02 Shrink SPACE;
        Table modifiée.

        SQL> SELECT SEGMENT_NAME, SUM(BLOCKS) FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_OBJECTS02' GROUP BY SEGMENT_NAME;
        SEGMENT_NAME          SUM(BLOCKS)
        ----------------------------------------------------------------
        T_OBJECTS02                       424

Et voilà, il reste 424 blocs après la réorganisation contre 512 pour le MOVE, soit quasiment tout l'espace récupéré!



============================================================================================
Détecter les tables avec trop de blocs vides

============================================================================================

Nous allons maintenant voir un ordre SQL qui va calculer l'espace disque réel et sur disque dur de nos tables, afin de voir celles qui ont besoin d'une réorganisation. Une fois cela fait, il vous suffit de vérifier les valeurs de la colonne "Taille MO" pour les deux lignes "TAILLE_REELLE_TABLE" et "TAILLE_SUR_DISQUE_TABLE".

Nous générons la requête uniquement pour la table de tests mais on peut le faire aussi pour un schéma entier.
Requête sur une table.
          SQL> SELECT owner, table_name,
                           'TAILLE_REELLE_TABLE' AS "TYPE_DE_TAILLE",
                           round((num_rows * avg_row_len)/(1024*1024),2) AS "TAILLE MO"
                  FROM dba_tab_statistics
                  WHERE table_name = 'T_OBJECTS02'
                  UNION
                  SELECT owner, segment_name,
                           'TAILLE_SUR_DISQUE_TABLE',
                           (blocks*(select value from v$parameter where UPPER(name) = 'DB_BLOCK_SIZE'))/(1024*1024)
                  FROM dba_segments
                  WHERE segment_name = 'T_OBJECTS02'
                  ORDER BY 1, 2;
       TYPE_DE_TAILLE                      TAILLE MO
       --------------------------------------------------------------------
       TAILLE_REELLE_TABLE                  2,65
       TAILLE_SUR_DISQUE_TABLE       33

Requête sur les tables d'un schéma.
         SQL> SELECT owner, table_name,
                  'TAILLE_REELLE_TABLE' AS "TYPE_DE_TAILLE",
                  round((num_rows * avg_row_len)/(1024*1024),2) AS "TAILLE MO"
         FROM dba_tab_statistics                       
         WHERE OWNER = 'HR'
         UNION
         SELECT owner, segment_name,
                  'TAILLE_SUR_DISQUE_TABLE',
                  (blocks*(select value from v$parameter where UPPER(name) = 'DB_BLOCK_SIZE'))/(1024*1024)
         FROM dba_segments
         WHERE OWNER = 'HR'
         ORDER BY 1, 2;
         OWNER                          TABLE_NAME                                                         TYPE_DE_TAILLE                          TAILLE MO
         ------------------------------ -------------------------------------------------------------------------------------------------------- -----
         HR                             DEPARTMENTS                                                     TAILLE_REELLE_TABLE                       0
         HR                             DEPARTMENTS                                                     TAILLE_SUR_DISQUE_TABLE               ,0625
         HR                             EMP                                                                       TAILLE_REELLE_TABLE                        0
         HR                             EMP                                                                       TAILLE_SUR_DISQUE_TABLE              ,0625
         HR                             EMPLOYEES                                                         TAILLE_REELLE_TABLE                         ,01
         HR                             EMPLOYEES                                                         TAILLE_SUR_DISQUE_TABLE                 ,0625
         HR                             JOB_HISTORY                                                      TAILLE_REELLE_TABLE                          0
         HR                             JOB_HISTORY                                                      TAILLE_SUR_DISQUE_TABLE                 ,0625
         HR                             JOBS                                                                     TAILLE_SUR_DISQUE_TABLE                 ,0625
         HR                             JOBS                                                                     TAILLE_REELLE_TABLE                          0
         HR                             LOCATIONS                                                           TAILLE_REELLE_TABLE                         0
         HR                             LOCATIONS                                                           TAILLE_SUR_DISQUE_TABLE                ,0625
         HR                             REGIONS                                                               TAILLE_REELLE_TABLE                         0
         HR                             REGIONS                                                               TAILLE_SUR_DISQUE_TABLE                ,0625
         HR                             T_OBJECTS02                                                       TAILLE_REELLE_TABLE                           2,65
         HR                             T_OBJECTS02                                                       TAILLE_SUR_DISQUE_TABLE                  33
         HR                             T_OBJECTS03                                                       TAILLE_SUR_DISQUE_TABLE                  33
         HR                             T_OBJECTS03                                                       TAILLE_REELLE_TABLE                           26,66
         19 ligne(s) sélectionnée(s).



Posté par David DBA à 12:33 - - Commentaires [0] - Permalien [#]
Tags : , , , , , ,


05 mars 2017

Structures mémoires X$ : comment leur nom est construit

                 
        
Introduction
Dans mon article "Trouver les objets Oracle cachés : tables système xxx$, structures mémoire X$xxx, paramètres cachés, packages PL/SQL cachés"
je parlais des structures mémoires X$xxx. Celles-ci ont des noms très particuliers comme X$KSDAFT ou X$KQFOPT et je vous mets au défi de deviner à quoi elles servent rien qu'avec leur nom!

Malheureusement ces structures mémoires ne sont pas documentées par Oracle et il est extrêmement difficile de trouver des infos sur le net sur leur nommage. Mais, en cherchant pendant longtemps, on arrive quand même à comprendre comment leur nom se compose.




Points d'attention
Ces structures mémoires n'étant pas documentées par Oracle, je vous conseille d'utiliser les vues dynamiques de performances V$ basées sur ces structures qui, elles, sont parfaitement documentées.



Base de tests
N'importe quelle base Oracle.




Exemples
============================================================================================
Sites web donnant la liste de ces structures mémoires X$xxx

============================================================================================
Ces objets excitent beaucoup les DBA car ce sont eux qui renferment les informations les plus précises sur ce qui se passe en base.Ils ont même parfois des infos non reprises dans les vues V$xxx; par exemple le champ TCH de X$BH est LE champ qui indique la popularité d'un bloc et c'est sa valeur qui dit si ce bloc va rester dans le Database Buffer Cache ou va en être éjecté pour laisser la place à des blocs plus populaires.

Pour cette raison, plusieurs sites web en donnent une liste plus ou moins détaillées MAIS sans expliquer comment leur nom est construit.

Sur le site de Daniel MORGAN, on a une liste impressionnante de ces structures pour Oracle 12c, classées par catégories avec même des explications sur leur rôle.
La page est ici : http://www.morganslibrary.org/reference/xdollarsign.ht

Il a même commencé pour Oracle 12c à classer ces structures mémoires selon les deux premières lettres de leur nom mais il n'est pas allé plus loin. La page est ici : http://www.morganslibrary.org/reference/kernel_subsystems.html et la liste complète est la suivante :
          KA Access Layer
          KC Cache Layer
          KD Data Layer
          KG Generic Layer
          KJ Lock Manager Layer
          KK Compilation Layer - Parse SQL, compile PL/SQL
          KQ Query Layer
          KS Services Layer
          KT Transaction Layer
          KV Kernel Variables (eg. x$KVIS and X$KVII)
          KX Execution Layer - Bind and execute SQL and PL/SQL
          KZ Security Layer - Validate privs
          K2 Distributed Execution Layer - 2PC handling
          NPI Network Program Interface
          ODS Operating System Dependencies
          OPI Oracle Program Interface
          RPI Recursive Program Interface
          S Operating System Dependencies

On trouve également sur le site de Donald K. BURLESON une liste de ces structures mémoires mais, à nouveau, sans détail sur la construction de leur nom. La page est ici : http://www.oracle-training.cc/oracle_tips_x$.htm. Attention, il s'agit d'une liste venant d'une version 8.1.5 d'Oracle.
         X$ks – Kernel Services
         x$ksmfs kernel services, memory fixed SGA
         x$ksmfsv kernel services, memory fixed SGA vectors
         x$ksmjs kernel services, memory java_pool summary
         x$ksmlru kernel services, memory LRU
         x$ksmls kernel services, memory large_pool summary
         x$ksmmem kernel services, memory
         x$ksmpp kernel services, memory process pool
         x$ksmsd kernel services, memory SGA definition
         x$ksmsp kernel services, memory shared pool
         x$ksmspr kernel services, memory shared pool reserved
         x$ksmss kernel services, memory shared_pool summary
         x$ksmup kernel services, memory user pool
         x$ksqst kernel services, enqueue status
         x$ksulop kernel services, user long operation
         x$ksulv kernel services, user locale value
         x$ksupr kernel services, user process

         X$kc – kernel cache
         x$kcbfwait kernel cache, block file wait
         x$kcbwait kernel cache, block wait
         x$kcccp kernel cache, controlfile checkpoint progress
         x$kcfio kernel cache, file I/O
         x$kclfh kernel cache, lock file header
         x$kclfi kernel cache, lock file index
         x$kcluh kernel cache, lock undo header
         x$kclui kernel cache, lock undo index

         X$kq – kernel query
         x$kqfco kernel query, fixed table columns
         x$kqfdt kernel query, fixed table
         x$kqfp kernel query, fixed procedure
         x$kqfsz kernel query, fixed size
         x$kqfta kernel query, fixed table
         x$kqfvi kernel query, fixed view
         x$kqfvt kernel query, fixed view table

         X$kg – kernel generic
         x$kghlu kernel generic, heap LRUs
         x$kgllk kernel generic, library cache lock
         x$kglob kernel generic, library cache object
         x$kglpn kernel generic, library cache pin
         x$kglst kernel generic, library cache status

         X$kz – Kernel security
         x$kzsro kernel security, system role

         X$le – lock element
         x$le lock element
         x$le_stat lock element status


============================================================================================
Site web expliquant comment sont nommées ces structures mémoires X$xxx

============================================================================================

C'est finalement sur le site http://www.eygle.com/refer/Oracle_x$table_list.htm que j'ai trouvé l'explication sur le nommage des structures, et ce lettre par lettre! Je recopie intégralement ici ce mail pour en faire une sauvegarde car j'ai beaucoup galéré pour trouver cette information.

Vous noterez les commentaires suivant : 
          ** INTERNAL ONLY **, comme si cette liste venait d'un mail d'un employé Oracle

          "The main purpose of this note is to show the naming conventions" ce qui est EXACTEMENT ce que je cherchais.


ATTENTION : la liste concerne la base de données d'Oracle 7.3.2 et la dernière révision du post remonte à septembre 1999!
Certes cette liste est en partie dépassée MAIS plusieurs de ces objets existent encore et je pense qu'Oracle a continué à nommer les nouvelles structures en utilisant cette nomenclature et ce classement.


Doc ID: Note:22241.1
Subject: List of X$ Tables and how the names are derived 
Type: REFERENCE
Status: PUBLISHED
Content Type: TEXT/PLAIN
Creation Date: 14-MAR-1995
Last Revision Date: 23-SEP-1999 
Language: USAENG
** INTERNAL ONLY **
This is a summary list of X$ Table Definitions - Last revision was 7.3.2
The main purpose of this note is to show the naming conventions.

  [K]ernel Layer                                                                
    [2]-Phase Commit                                                            
      [G]lobal [T]ransaction [E]ntry                                            
        X$K2GTE  - Current 2PC tx                                               
        X$K2GTE2 - Current 2PC tx                                               

    [C]ache Layer                                                               
      [B]uffer Management                                                       
        Buffer [H]ash                                                           
          X$BH - Hash Table                                                     
        Buffer LRU Statistics                                                   
          X$KCBCBH - [C]urrent [B]uffers (buckets) - lru_statistics             
          X$KCBRBH - [R]ecent [B]uffers (buckets) - lru_extended                
        Buffer [WAIT]s                                                          
          X$KCBWAIT  - Waits by block class                                     
          X$KCBFWAIT - Waits by File                                            
        [W]orking Sets - 7.3 or higher                                          
          X$KCBWDS - Set [D]escriptors                                          

      [C]ontrol File Management                                                 
        [C]ontrol [F]ile List - 7.0.16 or higher                                
          X$KCCCF - Control File Names & status                                 
        [D]atabase [I]nformation                                                
          X$KCCDI - Database Information                                        
        Data [F]iles                                                            
          X$KCCFE - File [E]ntries ( from control file )                        
          X$KCCFN - [F]ile [N]ames                                              
        [L]og Files                                                             
          X$KCCLE - Log File [E]ntries                                          
          X$KCCLH - Log [H]istory ( archive entries )                           
        Thread Information                                                      
          X$KCCRT - [R]edo [T]hread Information                                 

      [F]ile Management                                                         
        X$KCFIO - File [IO] Statistics                                          

      [L]ock Manager Component ( LCK )                                          
        [H]ash and Bucket Tables - 7.0.15 to 7.1.1, and 7.2.0 or higher         
          X$KCLFH - File [H]ash Table                                           
          X$KCLFI - File Bucket Table                                           
        X$LE - Lock [E]lements                                                  
        X$LE_STAT - Lock Conversion [STAT]istics                                
        X$KCLFX - Lock Element [F]ree list statistics - 7.3 or higher           
        X$KCLLS - Per LCK free list statistics - 7.3 or higher                  
        X$KCLQN - [N]ame (hash) table statistics - 7.3 or higher                

      [R]edo Component                                                          
        [M]edia recovery  - kcra.h - 7.3 or higher                              
          X$KCRMF - [F]ile context                                              
          X$KCRMT - [T]hread context                                            
          X$KCRMX - Recovery Conte[X]t                                          
        [F]ile read                                                             
          X$KCRFX - File Read Conte[X]t -  7.3 or higher                        
      Reco[V]ery Component                                                      
        [F]ile [H]eaders                                                        
          X$KCVFH - All file headers                                            
          X$KCVFHMRR - Files with [M]edia [R]ecovery [R]equired                 
          X$KCVFHONL - [ONL]ine File headers                                    

      [K]ompatibility Management - 7.1.1 or higher                              
        X$KCKCE - [C]ompatibility Segment [E]ntries                             
        X$KCKTY - Compatibility [TY]pes                                         
        X$KCKFM - Compatibility [F]or[M]ats ( index into X$KCKCE )              

    [D]ata Layer                                                                
      Sequence [N]umber Component                                               
         X$KDNCE - Sequence [C]ache [E]ntries - 7.2 or lower                     
        [S]equence Enqueues - common area for enqueue objects                   
          X$KDNSSC - [C]ache Enqueue Objects - 7.2 or lower                     
          X$KDNSSF - [F]lush Enqueue Objects - 7.2 or lower                     
        X$KDNST - Cache [ST]atistics - 7.2 or lower                             

      Inde[X] Block Component                                                   
        X$KDXHS - Index [H]i[S]togram                                           
        X$KDXST - Index [ST]atistics                                            

    [G]eneric Layer                                                             
      [H]eap Manager                                                            
        X$KGHLU - State (summary) of [L]R[U] heap(s) - defined in ksmh.h        

      [I]nstantiation Manager                                                   
        [C]ursor [C]ache                                                        
          X$KGICC - Session statistics - defined in kqlf.h                      
          X$KGICS - System wide statistics - defined in kqlf.h                  

      [L]ibrary Cache Manager  ( defined and mapped from kqlf )                 
        Bind Variables                                                          
          X$KKSBV - Library Object [B]ind [V]ariables                           
        Object Cache                                                            
          X$KGLOB - All [OB]jects                                               
          X$KGLTABLE   - Filter for [TABLE]s                                    
          X$KGLBODY    - Filter for [BODY] ( packages )                         
          X$KGLTRIGGER - Filter for [TRIGGER]s                                  
          X$KGLINDEX   - Filter for [INDEX]es                                   
          X$KGLCLUSTER - Filter for [CLUSTER]s                                  
          X$KGLCURSOR  - Filter for [CURSOR]s                                   
        Cache Dependency                                                        
          X$KGLDP - Object [D]e[P]endency table                                 
          X$KGLRD - [R]ead only [D]ependency table - 7.3 or higher              
        Object Locks                                                            
          X$KGLLK - Object [L]oc[K]s                                            
        Object Names                                                            
          X$KGLNA - Object [NA]mes (sql text)                                   
          X$KGLNA1 - Object [NA]mes (sql text) with newlines - 7.2.0 or higher  
        Object Pins                                                             
          X$KGLPN - Object [P]i[N]s                                             
        Cache Statistics                                                        
          X$KGLST - Library cache [ST]atistics                                  
        Translation Table                                                       
          X$KGLTR - Address [TR]anslation                                       
        Access Table                                                            
          X$KGLXS - Object Access Table                                         
        Authorization Table - 7.1.5 or higher                                   
          X$KGLAU - Object Authorization table                                  
        Latch Cleanup - 7.0.15 or higher                                        
          X$KGLLC - [L]atch [C]leanup for Cache/Pin Latches                     

    [K]ompile Layer                                                             
      [S]hared Objects                                                          
        X$KKSAI - Cursor [A]llocation [I]nformation - 7.3.2 or higher           

    [L]oader                                                                    
      [L]ibrary                                                                 
        X$KLLCNT - [C]o[NT]rol Statistics                                       
        X$KLLTAB - [TAB]le Statistics                                           

    [M]ulti-Threaded Layer                                                      
      [C]ircuit component                                                       
        X$KMCQS - Current [Q]ueue [S]tate                                       
        X$KMCVC - [V]irtual [C]ircuit state                                     

      [M]onitor Server/dispatcher                                               
        [D]ispatcher                                                            
          X$KMMDI - [D]ispatcher [I]nfo (status)                                
           X$KMMDP - [D]ispatcher Config ( [P]rotocol info )                     
        [S]erver                                                                
          X$KMMSI - [S]erver [I]nfo ( status )                                  
        X$KMMSG - [SG]a info ( global statistics)                               
        X$KMMRD - [R]equest timing [D]istributions                              

    s[Q]l Version and Option Layer                                              
      Kernel [V]ersions                                                         
        X$VERSION - Library versions                                            
      Kernel [O]ptions - 7.1.3 or higher                                        
        X$OPTION - Server Options                                               

    [Q]uery Layer                                                               
      [D]ictionary Cache Management                                             
        X$KQDPG - [PG]a row cache cursor statistics                             

      [F]ixed Tables/views Management                                           
        X$KQFCO - Table [CO]lumn definitions                                    
        X$KQFDT - [D]erived [T]ables                                            
        X$KQFSZ - Kernel Data structure type [S]i[Z]es                          
        X$KQFTA - Fixed [TA]bles                                                
        X$KQFVI - Fixed [VI]ews                                                 
        X$KQFVT - [V]iew [T]ext definition - 7.2.0 or higher                    

      [R]ow Cache Management                                                    
        X$KQRST - Cache [ST]atistics                                            
        X$KQRPD - [P]arent Cache [D]efinition - 7.1.5 or higher                 
        X$KQRSD - [S]ubordinate Cache [D]efinition - 7.1.5 or higher            

    [S]ervice Layer                                                             
      [B]ackground Management                                                   
        [D]etached Process                                                      
          X$KSBDD - Detached Process [D]efinition (info)                        
          X$KSBDP - Detached [P]rocess Descriptor (name)                        
          X$MESSAGES - Background Message table                                 

      [I]nstance [M]anagement - 7.3 or higher                                   
        X$KSIMAT - Instance [AT]tributes                                        
        X$KSIMAV - [A]ttribute [V]alues for all instances                       
        X$KSIMSI - [S]erial and [I]nstance numbers                              

      [L]ock Management                                                         
        [E]vent Waits                                                           
          X$KSLED - Event [D]escriptors                                         
          X$KSLEI - [I]nstance wide statistics since startup                    
          X$KSLES - Current [S]ession statistics                                
        [L]atches                                                               
          X$KSLLD - Latch [D]escriptor (name)                                   
          X$KSLLT - Latch statistics [ + Child latches @ 7.3 or higher ]        
          X$KSLLW - Latch context ( [W]here ) descriptors - 7.3 or higher       
          X$KSLPO - Latch [PO]st statistics - 7.3 or higher                     
          X$KSLWSC- No[W]ait and [S]leep [C]ount stats by Context -7.3 or higher

      [M]emory Management                                                       
        [C]ontext areas                                                         
          X$KSMCX - E[X]tended statistics on usage - 7.3.1 or lower             
        Heap Areas                                                              
          X$KSMSP - SGA Hea[P]                                                  
          X$KSMPP - [P]GA Hea[P] - 7.3.2 and above                              
          X$KSMUP - [U]GA Hea[P] - 7.3.2 and above                              
          X$KSMHP - Any [H]ea[P] - 7.3.2 and above                              
          X$KSMSPR- [S]hared [P]ool [R]eserved List - 7.1.5 or higher           
        [L]east recently used shared pool chunks                                
          X$KSMLRU - LR[U] flushes from the shared pool                         
        [S]GA Objects                                                           
          X$KSMSD - Size [D]efinition for Fixed/Variable summary                
          X$KSMSS - Statistics (lengths) of SGA objects                         
        SGA [MEM]ory                                                            
           X$KSMMEM - map of the entire SGA - 7.2.0 or higher                    
          X$KSMFSV - Addresses of [F]ixed [S]GA [V]ariables - 7.2.1 or higher   

      [P]arameter Component                                                     
          X$KSPPI  - [P]arameter [I]nfo ( Names )                               
          X$KSPPCV - [C]urrent Session [V]alues - 7.3.2 or above                
          X$KSPPSV - [S]ystem [V]alues - 7.3.2 or above                         

      En[Q]ueue Management                                                      
        X$KSQDN - Global [D]atabase [N]ame                                      
        X$KSQEQ - [E]n[Q]ueue Object                                            
        X$KSQRS - Enqueue [R]e[S]ource                                          
        X$KSQST - Enqueue [S]tatistics by [T]ype                                

      [U]ser Management                                                         
        [C]ost                                                                  
          X$KSUCF - Cost [F]unction (resource limit)                            
        [L]icence                                                               
           X$KSULL - Licence [L]imits                                           
        [L]anguage Manager                                                      
          X$NLS_PARAMETERS - NLS parameters                                     
          X$KSULV - NLS [V]alid Values - 7.1.2 or higher                        
        [MY] [ST]atistics                                                       
          X$KSUMYSTA - [MY] [ST]atisics (current session)                       
        [P]rocess Info                                                          
          X$KSUPL - Process (resource) [L]imits                                 
          X$KSUPRLAT - [LAT]ch Holder                                           
          X$KSUPR - Process object                                              
        [R]esource                                                              
          X$KSURU - Resource [U]sage                                            
        [S]tatistics                                                            
          X$KSUSD - [D]escriptors (statistic names)                             
          X$KSUSGSTA - [G]lobal [ST]atistics                                    
        [SE]ssions                                                              
          X$KSUSECST - Session status for events                                
          X$KSUSESTA - Session [STA]tistics                                     
          X$KSUSECON - [CON]nection Authentication - 7.2.1 or higher            
          X$KSUSE - [SE]ssion Info                                              
          X$KSUSIO - [S]ystem [IO] statistics per session                       
        [T]imer                                                                 
          X$KSUTM - Ti[M]e in 1/100th seconds                                   
        Instance [X]                                                            
          X$KSUXSINST - [INST]ance state                                        
        [T]race management                                                      
          X$TRACE - Current traced events                                       
          X$TRACES - All possible traces                                        
          X$KSTEX - Code [EX]ecution - 7.2.1 or higher                          

      E[X]ecution Management                                                    
        Device/Node [A]ffinity - 7.3.2 and above                                
          X$KSXAFA - Current File/Node Affinity                                 

    [T]ransaction Layer                                                         
      Table [A]ccess [D]efinition                                               
        X$KTADM - D[M]L lock                                                    

      [C]ontrol Component                                                       
        X$KTCXB - Transaction O[B]ject                                          

      [S]or[T] Segments - 7.3 or higher                                         
        X$KTSTSSD - [S]ort [S]egment [D]escriptor - per tablespace statistics   

      [T]ablespace                                                              
        X$KTTVS - [V]alid [S]aveundo                                            

      [U]ndo                                                                    
        X$KTURD - Inuse [D]escriptors                                           
        X$KTUXE - Transaction [E]ntry (table) - 7.3.2 or above                  

    Performance Layer [V] - 7.0.16 or higher                                    
       [I]nformation tables                                                      
        X$KVII - [I]nitialisation Instance parameters                           
        X$KVIS - [S]izes of structure elements                                  
        X$KVIT - [T]ransitory Instance parameters                               

    Security Layer [Z]                                                          
      [D]ictionary Component                                                    
        X$KZDOS - [OS] roles                                                    

      [S]ecurity State                                                          
        X$KZSPR - Enabled [PR]ivileges                                          
        X$KZSRO - Enabled [RO]les                                               

      [R]emote Logins - 7.1.1 or higher                                         
        X$KZSRT - [R]emote Password File [T]able entries                        

    E[X]ecution Layer                                                           
      Parallel Query (Execute [F]ast) - 7.1.1 or higher                         
        [P]rocess and Queue Manager                                             
          Statistics - 7.1.3 or higher                                          
            X$KXFPYS - S[YS]tem Statistics                                      
            X$KXFPDP - [D]etached [P]rocess (slave) statistics                  
            X$KXFQSROW - Table [Q]ueue Statistics - 7.3.2 or higher             
          [C]oordinator Component                                               
            X$KXFPCST - Query [ST]atistics                                      
            X$KXFPCMS - [M]essage [S]tatistics                                  
            X$KXFPCDS - [D]equeue [S]tatistics                                  
          [S]lave Component                                                     
            X$KXFPSST - Query [ST]atistics                                      
            X$KXFPSMS - [M]essage [S]tatistics                                  
            X$KXFPCDS - [D]equeue [S]tatistics                                  

      [S]hared Cursor                                                           
        X$KXSBD - [B]ind [D]ata - 7.3.2 and above                               
        X$KXSCC - SQL [C]ursor [C]ache Data - 7.3.2 and above                   

  [N]etwork Layer - 7.0.15 or higher                                            
    Network [CO]nnections                                                       
      X$UGANCO - Current [N]etwork [CO]nnections

--------------------------------------------------------------------------------
 
Copyright (c) 1995,1999 Oracle Corporation. All Rights Reserved. Legal Notices and Terms of Use.


Quelques remarques sur cette liste

Cette liste date d'il y a vingt ans, elle doit donc être manipulée avec une grande précaution.

Par exemple, dans la liste ci-dessus la structure X$BH est décrite comme "Hash Table" alors que pour la 12c V$BH, s'appuyant sur X$BH, est la vue donnant accès aux Buffers Headers; on est donc loin du hash table. Néanmoins les codes utilisés pour nommer X$BH sont les suivants : B pour "[B]uffer Management" et H pour "Buffer [H]ash"; on est quand même bien dans la gestion des buffers, c'est le libellé "Hash table" qui me semble décalé.

A contrario la structure X$KQFCO "Table [CO]lumn definitions" existe encore dans la version 12c si on se base sur la liste de Daniel MORGAN même si son rôle n'est pas donné. Hé bien, c'est une excellente occasion de faire un test!!!!!

D'après la liste de 1999 son nom se décompose comme suit :
     [K]ernel Layer
          [Q]uery Layer
               [F]ixed Tables/views Management
                    [CO]lumn definitions
Visiblement elle sert à manager les tables, et plus précisément leurs colonnes, ce qui est raccord avec son rôle "[CO]lumn definitions".

          SQL> desc X$KQFCO
          Nom                     NULL ?           Type
          ----------------------------------------- -------- ----------------------------
          ADDR                                         RAW(8)
          INDX                                         NUMBER
          INST_ID                                     NUMBER
          KQFCOTAB                               NUMBER
          KQFCOTOB                               NUMBER
          KQFCOCNO                              NUMBER
          KQFCONAM                              VARCHAR2(30)
          KQFCODTY                               NUMBER
          KQFCOTYP                               NUMBER
          KQFCOMAX                               NUMBER
          KQFCOLSZ                               NUMBER
          KQFCOLOF                               NUMBER
          KQFCOSIZ                               NUMBER
          KQFCOOFF                              NUMBER
          KQFCOIDX                               NUMBER
          KQFCOIPO                              NUMBER

On remarque de suite que la colonne KQFCONAM est la seule de type VARCHAR2 et, surtout, qu'elle est de longueur 30! J'en déduis que c'est l'attribut pour le nom des colonnes car ce nom est limité à 30 caractères sous Oracle. En outre son libellé est explicit : CONAM signifie COlumn NAMe.
Avec le SELECT suivant, on confirme que cette structure mémoire gère bien les colonnes.
          SQL> select KQFCONAM, count(*) from X$KQFCO group by KQFCONAM having count(*) > 1 order by count(*);
          KQFCONAM                COUNT(*)
          ------------------------------ -------------------
          ...
         
OBJ#                                  24
          VALUE                               25
          INCIDENT_ID                      32
          PROBLEM_ID                     34
          TYPE                                 34
          STATUS                             37
          NAME                                64
          ADR_HOME                       83
          ADR_PATH_IDX                  83
          FLAGS                             108
          INST_ID                            909

          INDX                                 909
          ADDR                               909
          981 ligne(s) sélectionnée(s).         


Faisons un autre test avec X$KCCFN dont le nom se décompose comme suit :  
          [K]ernel Layer
                    [C]ache Layer
                              [C]ontrol File Management
                                        [F]ile [N]ames 

Est-ce que cette structure gère bien les noms des fichiers de la base?
Hé bien oui, le SELECT ci-dessous le prouve.
          SQL> desc X$KCCFN;
          Nom                     NULL ?           Type
          ------------------------------------------------------------------
          ADDR                                         RAW(8)
          INDX                                           NUMBER
          INST_ID                                      NUMBER
          FNNUM                                      NUMBER
          FNTYP                                        NUMBER
          FNFNO                                       NUMBER
          FNFWD                                      NUMBER
          FNBWD                                      NUMBER
          FNFLG                                       NUMBER
          FNNAM                                      VARCHAR2(513)
          FNONM                                      VARCHAR2(513)
          FNBOF                                       NUMBER
          FNUNN                                       NUMBER
          BYTES                                       NUMBER

          SQL> select FNNAM from X$KCCFN order by 1;
          FNNAM

          ------------------------------------------------------------------------------------------------------------------------------------------------
          F:\APP\YUKIO\ORADATA\TEST01\REDO01.LOG
          F:\APP\YUKIO\ORADATA\TEST01\REDO02.LOG
          F:\APP\YUKIO\ORADATA\TEST01\REDO03.LOG
          F:\APP\YUKIO\ORADATA\TEST01\SYSAUX01.DBF
          F:\APP\YUKIO\ORADATA\TEST01\SYSTEM01.DBF
          F:\APP\YUKIO\ORADATA\TEST01\TEMP01.DBF
          F:\APP\YUKIO\ORADATA\TEST01\UNDOTBS01.DBF
          F:\APP\YUKIO\ORADATA\TEST01\USERS01.DBF         
          8 ligne(s) sélectionnée(s).


Au vu de ces tests on peut donc déduire que la liste de 1995 est encore utilisable pour déconstruire le nom des structures mémoires d'Oracle et deviner leur utilité, même pour les structures non répertoriées dans cette vieille liste!