Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Blog d'un DBA sur le SGBD Oracle et SQL
16 décembre 2019

Les tables AWR non externalisées dans les vues DBA_HIST*** - AWR tables not outsourced in DBA_HIST*** views


Introduction
Petit rappel : la modélisation des données d'un S.I. peut se faire à quatre niveaux :
    - MCD : Modèle Conceptuel de Données
    - MLD : Modèle Logique de Données
    - MPD : Modèle Physique de Données
    - MED : Modèle Externe de Données

Le MED est le moins connu mais, paradoxalement, le plus utilisé par les éditeurs de logiciels :-) Le MED sert à cacher le MPD en créant des vues sur ce MPD justement. Par exemple les vraies tables Oracle sont tab$ (externalisée en DBA_TABLES), obj$ (externalisée en DBA_OBJECTS) etc etc. Idem pour les vues dynamiques de performances (en réalité des synonymes) : V$BH pointe vers X$BH (attention, les structures mémoires X$ ne sont accessibles que si vous êtes connecté comme SYS).


Pourquoi ce choix d'Oracle de travailler non pas avec le MPD mais avec un MED? Cela sert à masquer la complexité du MPD, à simplifier l'affichage d'informations provenant de N sources dans une seule vue (DBA_TABLES affiche des infos de tab$, user$ etc etc) mais aussi à empêcher les petits curieux de trouver des infos trop précises sur le fonctionnement interne d'Oracle; pour ce faire Oracle donne des noms tordus à ses tables ou colonnes voir rend cryptique les données affichées (les fameuses colonnes SPARE... où il faut utiliser des commandes BITOR, BITAND pour les interroger) .

Et la question qui se pose est : est-il possible justement de lister les tables du MPD non externalisées dans le MED Oracle? C'est le but de cet article!


 

Points d'attention
N/A.
 


 
Base de tests
Une base Oracle 18c.


 
Exemples
============================================================================================
Le référentiel AWR
============================================================================================
Nous allons prendre comme exemple le référentiel AWR (Automatic Workload Repository) où les vraies tables du MDP commencent par WR*$ et sont externalisées dans les vues DBA_HIST. Mais pas toutes, et ce sont justement celles que l'on veut identifier :-) Bien sur, il n'existe pas de colonne dans tab$ disant si cette table est externalisée ou non dans une vue DBA_HIST***, ce serait trop simple, il va donc falloir ruser!
    
Petit rappel, Oracle a 151 vues et 152 synonymes DBA_HIST***.
     SQL> select object_type, count(*)
          from dba_objects
          where object_name like 'DBA_HIST%'
          group by object_type
          order by 1;
     OBJECT_TYPE          COUNT(*)
     ----------------------- ----------
     SYNONYM                152
     VIEW                   151
     
Le nombre d'objets dans le référentiel AWR est de 1013.
     SQL> select count(*) from dba_objects where object_name like 'WR%$%';
     COUNT(*)
     ----------
     1013
     
Si on regarde la répartition par type d'objets, on arrive à 364 tables AWR : nous sommes loin des 151 vues censées externalisées ces tables, ce qui signifie que beaucoup d'informations ne sont pas accessibles facilement (les vraies tables du dictionnaire ne sont pas documentées par Oracle).
     SQL> select object_type, count(*)
          from dba_objects
          where object_name like 'WR%$%'
          group by cube(object_type)
          order by 1;
     
     OBJECT_TYPE          COUNT(*)
     ----------------------- ----------
     INDEX                   321
     INDEX PARTITION         79
     SEQUENCE            23
     SYNONYM             28
     TABLE                   364
     TABLE PARTITION         87
     TABLE SUBPARTITION        32
     TYPE                41
     TYPE BODY            38
                         1013
     
On peut classer ces tables en cinq grandes familles. Attention, les tables WRP* et WRR* semblent récentes car je n'ai pas trouvé d'infos dessus avec Google. Ce sont surtout les tables WRH$ qui m'intéressent, celles utilisées par les vues DBA_HIST***. Bon, là il y en a 189; à rapprocher des 151 vues : on est déjà plus proche.
    - The wrm$ tables store metadata information for the Workload Repository
    - The wrh$ tables store historical data or snapshots
    - The wri$ tables: These tables store data related to advisory functions
     
     SQL> select substr(object_name, 1, 3), count(*) from dba_objects where object_name like 'WR%$%' and object_type = 'TABLE' group by cube(substr(object_name, 1, 3)) order by 1;
     SUBSTR(OBJEC   COUNT(*)
     ------------ ----------
     WRH            189
     WRI            105
     WRM             16
     WRP              4
     WRR             50
                 364
     6 rows selected.

     
============================================================================================
Exemple : trouver les objets utilisés par la vue DBA_HIST_SQLSTAT
============================================================================================
Prenons comme exemple une vue AWR très utile, DBA_HIST_SQLSTAT.
     [oracle@vbgeneric ~]$ sqlplus SYS as sysdba
     
Aïe, déjà problème... ça commence bien!
     SQL> SET LONG 1000000
     SQL> select dbms_metadata.get_ddl('VIEW', 'DBA_HIST_SQLSTAT' ) from dual;
     ERROR:
     ORA-31603: object "DBA_HIST_SQLSTAT" of type VIEW not found in schema "SYS"
     ORA-06512: at "SYS.DBMS_METADATA", line 6478
     ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
     ORA-06512: at "SYS.DBMS_METADATA", line 6465
     ORA-06512: at "SYS.DBMS_METADATA", line 9202
     ORA-06512: at line 1
     
     no rows selected
     
On est où? Ah, pas dans le bon container. On est effectivement en 12c multi-tenants et il faut se connecter au CDB$ROOT si on veut le code DDL des objets du schéma SYS (même si en vrai c'est un peu plus complexe que cela).
     SQL> select cdb from v$database;
     CDB
     ---
     YES
     
     SQL> show con_name
     CON_NAME
     ------------------------------
     ORCL

     SQL> alter session set container = CDB$ROOT;

     Session altered.
     
OK, j'ai le texte DDL de la vue mais, pas de chance, cette vue pointe vers une autre vue, AWR_ROOT_SQLSTAT.
     SQL> SET LONG 1000000
     SQL> select dbms_metadata.get_ddl('VIEW', 'DBA_HIST_SQLSTAT' ) from dual;
     DBMS_METADATA.GET_DDL('VIEW','DBA_HIST_SQLSTAT')
     --------------------------------------------------------------------------------
       CREATE OR REPLACE FORCE NONEDITIONABLE VIEW "SYS"."DBA_HIST_SQLSTAT" ("SNAP_ID
     ", "DBID", "INSTANCE_NUMBER", "SQL_ID", "PLAN_HASH_VALUE"
     ...
      AS
       select "SNAP_ID","DBID","INSTANCE_NUMBER","SQL_ID","PLAN_HASH_VALUE"
     ...
     from AWR_ROOT_SQLSTAT
     
Bon ben on recommence avec AWR_ROOT_SQLSTAT :-) Hum, problème, on accède encore à une vue, de nom AWR_ROOT_SNAPSHOT. 
     SQL> select dbms_metadata.get_ddl('VIEW', 'AWR_ROOT_SQLSTAT' ) from dual;
     DBMS_METADATA.GET_DDL('VIEW','AWR_ROOT_SQLSTAT')
     --------------------------------------------------------------------------------
       CREATE OR REPLACE FORCE NONEDITIONABLE VIEW "SYS"."AWR_ROOT_SQLSTAT"    CONTAINE
     R_DATA ("SNAP_ID", "DBID", "INSTANCE_NUMBER", "SQL_ID", "PLAN_HASH_VALUE"
     ...
     AS
     select sql.snap_id, sql.dbid, sql.instance_number, sql_id, plan_hash_value
     ...
     from AWR_ROOT_SNAPSHOT sn, WRH$_SQLSTAT sql
       where     sn.snap_id           = sql.snap_id
         and sn.dbid           = sql.dbid
         and sn.instance_number = sql.instance_number


============================================================================================
Utilisation de la fonction DBMS_UTILITY.EXPAND_SQL_TEXT
============================================================================================
OK, on va pas continuer ce petit jeu là durant 107 ans, utilisons alors plutôt la fonction DBMS_UTILITY.EXPAND_SQL_TEXT pour lister, via un SELECT * sur une vue, les vraies tables sous-jacentes car cette fonction travaille de façon récursive.
     SQL> set serveroutput on
     SQL> declare
         v_in_view  clob := 'SELECT * FROM SYS.DBA_HIST_SQLSTAT';
         v_out_view clob;
         begin
             dbms_utility.expand_sql_text(v_in_view, v_out_view);
             dbms_output.put_line(v_out_view);
         end;
         /                
     
Je mets juste un extract car l'ordre est trop long mais on voit bien qu'on accède enfin aux tables comme "WRM$_SNAPSHOT" mais aussi aux structures mémoires sous les synonymes V$ que sont les X$ comme "SYS"."X$MODACT_LENGTH".
     SELECT "A1"."SNAP_ID" "SNAP_ID","A1"."DBID" "DBID","A1"."INSTANCE_NUMBER" "INSTANCE_NUMBER","A1"."SQL_ID" "SQL_ID","A1"."PLAN_HASH_VALUE" "PLAN_HASH_VALUE"
     ...
     FROM (SELECT "A2"."SNAP_ID" "SNAP_ID","A2"."DBID" "DBID","A2"."INSTANCE_NUMBER" "INSTANCE_NUMBER","A2"."SQL_ID" "SQL_ID","A2"."PLAN_HASH_VALUE" "PLAN_HASH_VALUE"
     ...
     FROM "SYS"."X$MODACT_LENGTH" "A7")) "MODULE",SUBSTRB("A3"."ACTION",1, (SELECT "A6"."KSUACTLEN" "KSUACTLEN"
     FROM "SYS"."X$MODACT_LENGTH" "A6")) "ACTION","A3"."SQL_PROFILE"
     ...
     FROM "SYS"."WRM$_SNAPSHOT" "A5" WHERE "A5"."STATUS"=0) "A4","SYS"."WRH$_SQLSTAT" "A3" WHERE
     "A4"."SNAP_ID"="A3"."SNAP_ID" AND "A4"."DBID"="A3"."DBID" AND "A4"."INSTANCE_NUMBER"="A3"."INSTANCE_NUMBER") "A2") "A1"
     
     PL/SQL procedure successfully completed.
    

============================================================================================
Scripts pour automatiser la recherche des tables du MPD 
============================================================================================
Plutôt que de perdre du temps à récupérer l'ordre DDL des vues avec dbms_metadata.get_ddl, on continue avec dbms_utility.expand_sql_text, bien plus pratique pour notre recherche. Pour automatiser cette recherche, nous allons maintenant créer un bloc PL/SQL qui va écrire dans un fichier à quoi correspondent tous les SELECTs sur les vues DBA_HIST***.

Script avec dbms_utility.expand_sql_text
Etape 1 : écriture dans un fichier de la liste des appels de la fonction dbms_utility.expand_sql_text pour les vues DBA_HIST***.
     SQL> set serveroutput on
     SQL> set lines 200 pages 50000
     SQL> spool zzexpand.sql;
     SQL> declare
         v_in_view  clob;
         v_out_view clob;
         CURSOR cur_awr_name IS SELECT object_name FROM dba_objects WHERE object_name like 'DBA_HIST%' and object_type = 'VIEW' ORDER BY object_name;
     
         BEGIN
             FOR i IN cur_awr_name
             LOOP
                 v_in_view := 'dbms_utility.expand_sql_text(' || '''SELECT * FROM SYS.' || i.object_name || ''', v_out_view);' || chr(10) || 'dbms_output.put_line(v_out_view);';
                 dbms_output.put_line(v_in_view);
             END LOOP;
         END;
         /
     SQL> spool off
     
Extrait du fichier obtenu.
     SQL> ! view zzexpand.sql
     dbms_utility.expand_sql_text('SELECT * FROM SYS.DBA_HIST_ACTIVE_SESS_HISTORY', v_out_view);
     dbms_output.put_line(v_out_view);
     dbms_utility.expand_sql_text('SELECT * FROM SYS.DBA_HIST_APPLY_SUMMARY', v_out_view);
     dbms_output.put_line(v_out_view);

Exécution du script avec ordres dbms_utility.expand_sql_text
Etape 2 : exécution du fichier .sql pour avoir les SELECTs de toutes les vues DBA_HIST***.
ATTENTION : il faut enlever dans ce fichier les premières lignes et les dernières, qui correspondent à des sorties SQL*Plus et pas au résultat de la requête.
     SQL> spool zzddl.txt
     SQL> declare
         v_out_view clob;
         begin
             @zzexpand.sql
         end;
         /
     SQL> spool off;

Extrait du fichier obtenu.

     SELECT "A1"."DBID" "DBID","A1"."FILE#" "FILE#","A1"."CREATION_CHANGE#"  "CREATION_CHANGE#","A1"."FILENAME" "FILENAME","A1"."TS#"          "TS#","A1"."TSNAME"  "TSNAME","A1"."BLOCK_SIZE" "BLOCK_SIZE","A1"."CON_DBID" "CON_DBID","A1"."CON_ID" "CON_ID" FROM (SELECT               "A2"."DBID" "DBID","A2"."FILE#"  "FILE#","A2"."CREATION_CHANGE#" "CREATION_CHANGE#","A2"."FILENAME"  "FILENAME","A2"."TS#"               "TS#","A2"."TSNAME" "TSNAME","A2"."BLOCK_SIZE"  "BLOCK_SIZE","A2"."CON_DBID" "CON_DBID","A2"."CON_ID" "CON_ID" FROM (SELECT
     "A3"."QCSJ_C000000000500000_0" "DBID","A3"."FILE#_1" "FILE#","A3"."CREATION_CHANGE#_2" "CREATION_CHANGE#","A3"."FILENAME_3"
     "FILENAME","A3"."QCSJ_C000000000500002_4" "TS#",COALESCE("A3"."QCSJ_C000000000500005_11","A3"."QCSJ_C000000000500004_5")
     "TSNAME","A3"."QCSJ_C000000000500008_6" "BLOCK_SIZE",DECODE("A3"."QCSJ_C000000000500006_7",0,"A3"."QCSJ_C000000000500000
     _0","A3"."QCSJ_C000000000500006_7") "CON_DBID",DECODE("A3"."QCSJ_C000000000500010_8",0,0,CON_DBID_TO_ID(DECODE("A3".
     "QCSJ_C000000000500006_7",0,"A3"."QCSJ_C000000000500000_0","A3"."QCSJ_C000000000500006_7"))) "CON_ID" FROM (SELECT "A5"."DBID"
     "QCSJ_C000000000500000_0","A5"."FILE#" "FILE#_1","A5"."CREATION_CHANGE#" "CREATION_CHANGE#_2","A5"."FILENAME" "FILENAME_3","A5"."TS#"      "QCSJ_C000000000500002_4","A5"."TSNAME" "QCSJ_C000000000500004_5","A5"."BLOCK_SIZE"
     "QCSJ_C000000000500008_6","A5"."CON_DBID" "QCSJ_C000000000500006_7","A5"."PER_PDB" "QCSJ_C000000000500010_8","A4"."DBID"
     "QCSJ_C000000000500001","A4"."TS#" "QCSJ_C000000000500003","A4"."TSNAME" "QCSJ_C000000000500005_11","A4"."CON_DBID"
     "QCSJ_C000000000500007","A4"."BLOCK_SIZE" "QCSJ_C000000000500009","A4"."PER_PDB" "QCSJ_C000000000500011" FROM "SYS"."WRH$_DATAFILE"        "A5","SYS"."WRH$_TABLESPACE" "A4" WHERE "A5"."DBID"="A4"."DBID" AND "A5"."TS#"="A4"."TS#" AND
     "A5"."CON_DBID"="A4"."CON_DBID") "A3") "A2") "A1"

Fichier des tables AWR
On crée maintenant un deuxième fichier, avec la liste des vraies tables AWR :
     SQL> spool zzawr.txt
     SQL> select object_name from dba_objects where object_name like 'WR%$%' and object_type = 'TABLE' order by 1;
     SQL> spool off
     
Extrait du contenu du fichier.
     SQL> ! view zzawr.txt
     OBJECT_NAME
     --------------------------------
     WRH$_ACTIVE_SESSION_HISTORY
     WRH$_ACTIVE_SESSION_HISTORY_BL
     WRH$_ASM_BAD_DISK
     WRH$_ASM_DISKGROUP
     WRH$_ASM_DISKGROUP_STAT


============================================================================================
Identifier les tables absentes des vues
============================================================================================
    
Maintenant il faut, pour chaque ligne du fichier avec les tables AWR, vérifier si la table existe dans le premier fichier, celui contenant les SELECTs des tables DBA_HIST***. En clair, il faut automatiser le commande suivante :
     [oracle@vbgeneric ~]$ grep -i 'WRH$_ASM_DISKGROUP' zzddl.txt | grep -i FROM
     "CON_DBID",DECODE("A3"."PER_PDB",0,0,CON_DBID_TO_ID(DECODE("A3"."CON_DBID",0,"A3"."DBID","A3"."CON_DBID"))) "CON_ID" FROM "SYS"."WRH$_ASM_DISKGROUP" "A3") "A2") "A1"                                   
     "CON_ID" FROM "SYS"."WRH$_ASM_DISKGROUP_STAT" "A3") "A2") "A1"     
     
Voici comment automatiser la recherche sous Linux. Merci aux membres du forum www.linuxquestions.org qui m'ont répondu :  https://www.linuxquestions.org/questions/showthread.php?p=6068066#post6068066

Le script lit ligne par ligne le contenu du fichier zzawr.txt et recherche dans le fichier zzddl.txt si le mot en entier (le nom de la table) s'y trouve. J'insère ensuite dans un fichier les résultats négatifs, à savoir les tables pour lesquelles il n'y a aucun SELECT des vues DBA_HIST***.
     Linux> while read -r line; do
         grep -iwFq "$line" zzddl.txt || echo "$line"
     done < zzawr.txt > zzresult
    
Hoho, 218 lignes... ce qui signifie que 218 tables AWR ne sont pas externalisées dans les vues DBA_HIST... bizarre, c'est beaucoup!
     [oracle@vbgeneric ~]$ wc -l zzresult
     218 zzresult
     
Pour rappel, voilà comment se répartissent les tables du référentiel AWR.
     SQL> select substr(object_name, 1, 3), count(*) from dba_objects where object_name like 'WR%$%' and object_type = 'TABLE' group by cube(substr(object_name, 1, 3)) order by 1;
     SUBSTR(OBJEC   COUNT(*)
     ------------ ----------
     WRH            189
     WRI            105
     WRM             16
     WRP              4
     WRR             50
                 364
     6 rows selected.
     
Liste des tables AWR non accédées par des vues pour une Oracle 18c
37 tables WRH$***. Celles non reprises dans les vues DBA_HIST*** se terminent toutes par _BL.
     WRH$_ACTIVE_SESSION_HISTORY_BL
     WRH$_CELL_DB_BL
     WRH$_CELL_DISK_SUMMARY_BL
     WRH$_CELL_GLOBAL_BL
     WRH$_CELL_GLOBAL_SUMMARY_BL
     WRH$_CELL_IOREASON_BL
     WRH$_CELL_OPEN_ALERTS_BL
     WRH$_CON_SYSMETRIC_HISTORY_BL
     WRH$_CON_SYSSTAT_BL
     WRH$_CON_SYSTEM_EVENT_BL
     WRH$_CON_SYS_TIME_MODEL_BL
     WRH$_DB_CACHE_ADVICE_BL
     WRH$_DLM_MISC_BL
     WRH$_EVENT_HISTOGRAM_BL
     WRH$_FILESTATXS_BL
     WRH$_IM_SEG_STAT_BL
     WRH$_INST_CACHE_TRANSFER_BL
     WRH$_INTERCONNECT_PINGS_BL
     WRH$_LATCH_BL
     WRH$_LATCH_CHILDREN_BL
     WRH$_LATCH_MISSES_SUMMARY_BL
     WRH$_LATCH_PARENT_BL
     WRH$_MVPARAMETER_BL
     WRH$_OSSTAT_BL
     WRH$_PARAMETER_BL
     WRH$_ROWCACHE_SUMMARY_BL
     WRH$_SEG_STAT_BL
     WRH$_SERVICE_STAT_BL
     WRH$_SERVICE_WAIT_CLASS_BL
     WRH$_SGASTAT_BL
     WRH$_SQLSTAT_BL
     WRH$_SYSMETRIC_HISTORY_BL
     WRH$_SYSSTAT_BL
     WRH$_SYSTEM_EVENT_BL
     WRH$_SYS_TIME_MODEL_BL
     WRH$_TABLESPACE_STAT_BL
     WRH$_WAITSTAT_BL
     
24 tables WRHS$_***
     WRHS$_CELL_IOREASON_NAME
     WRHS$_CELL_METRIC_DESC
     WRHS$_DATAFILE
     WRHS$_EVENT_NAME
     WRHS$_IM_SEG_STAT_OBJ
     WRHS$_IOSTAT_FILETYPE_NAME
     WRHS$_IOSTAT_FUNCTION_NAME
     WRHS$_LATCH_NAME
     WRHS$_METRIC_NAME
     WRHS$_OPTIMIZER_ENV
     WRHS$_OSSTAT_NAME
     WRHS$_PARAMETER_NAME
     WRHS$_PLAN_OPERATION_NAME
     WRHS$_PLAN_OPTION_NAME
     WRHS$_SEG_STAT_OBJ
     WRHS$_SERVICE_NAME
     WRHS$_SQLCOMMAND_NAME
     WRHS$_SQLTEXT
     WRHS$_SQL_BIND_METADATA
     WRHS$_SQL_PLAN
     WRHS$_STAT_NAME
     WRHS$_TABLESPACE
     WRHS$_TEMPFILE
     WRHS$_TOPLEVELCALL_NAME
     
102 tables WRI$_*
     WRI$_ADV_ACTIONS
     WRI$_ADV_ADDM_FDG
     WRI$_ADV_ADDM_INST
     WRI$_ADV_ADDM_PDBS
     WRI$_ADV_ADDM_TASKS
     WRI$_ADV_ASA_RECO_DATA
     WRI$_ADV_DEFINITIONS
     WRI$_ADV_DEF_EXEC_TYPES
     WRI$_ADV_DEF_PARAMETERS
     WRI$_ADV_DIRECTIVE_DEFS
     WRI$_ADV_DIRECTIVE_INSTANCES
     WRI$_ADV_DIRECTIVE_META
     WRI$_ADV_EXECUTIONS
     WRI$_ADV_EXEC_PARAMETERS
     WRI$_ADV_FINDINGS
     WRI$_ADV_INST_FDG
     WRI$_ADV_JOURNAL
     WRI$_ADV_MESSAGE_GROUPS
     WRI$_ADV_OBJECTS
     WRI$_ADV_PARAMETERS
     WRI$_ADV_RATIONALE
     WRI$_ADV_RECOMMENDATIONS
     WRI$_ADV_REC_ACTIONS
     WRI$_ADV_SQLA_COLVOL
     WRI$_ADV_SQLA_FAKE_REG
     WRI$_ADV_SQLA_MAP
     WRI$_ADV_SQLA_STMTS
     WRI$_ADV_SQLA_SUM
     WRI$_ADV_SQLA_TABLES
     WRI$_ADV_SQLA_TABVOL
     WRI$_ADV_SQLA_TMP
     WRI$_ADV_SQLT_BINDS
     WRI$_ADV_SQLT_PLANS
     WRI$_ADV_SQLT_PLAN_HASH
     WRI$_ADV_SQLT_PLAN_STATS
     WRI$_ADV_SQLT_RTN_PLAN
     WRI$_ADV_SQLT_STATISTICS
     WRI$_ADV_SQLW_COLVOL
     WRI$_ADV_SQLW_STMTS
     WRI$_ADV_SQLW_SUM
     WRI$_ADV_SQLW_TABLES
     WRI$_ADV_SQLW_TABVOL
     WRI$_ADV_TASKS
     WRI$_ADV_USAGE
     WRI$_AGGREGATION_ENABLED
     WRI$_ALERT_HISTORY
     WRI$_ALERT_OUTSTANDING
     WRI$_ALERT_THRESHOLD
     WRI$_ALERT_THRESHOLD_LOG
     WRI$_DBU_CPU_USAGE
     WRI$_DBU_CPU_USAGE_SAMPLE
     WRI$_DBU_FEATURE_METADATA
     WRI$_DBU_FEATURE_USAGE
     WRI$_DBU_HIGH_WATER_MARK
     WRI$_DBU_HWM_METADATA
     WRI$_DBU_USAGE_SAMPLE
     WRI$_EMX_FILES
     WRI$_HEATMAP_TOPN_DEP1
     WRI$_HEATMAP_TOPN_DEP2
     WRI$_HEATMAP_TOP_OBJECTS
     WRI$_HEATMAP_TOP_TABLESPACES
     WRI$_INDEX_USAGE
     WRI$_MASKING_SCRIPT_PROGRESS
     WRI$_OPTSTAT_AUX_HISTORY
     WRI$_OPTSTAT_HISTGRM_HISTORY
     WRI$_OPTSTAT_HISTHEAD_HISTORY
     WRI$_OPTSTAT_IND_HISTORY
     WRI$_OPTSTAT_OPR
     WRI$_OPTSTAT_OPR_TASKS
     WRI$_OPTSTAT_SYNOPSIS$
     WRI$_OPTSTAT_SYNOPSIS_HEAD$
     WRI$_OPTSTAT_SYNOPSIS_PARTGRP
     WRI$_OPTSTAT_TAB_HISTORY
     WRI$_REPT_COMPONENTS
     WRI$_REPT_FORMATS
     WRI$_REPT_REPORTS
     WRI$_SCH_CONTROL
     WRI$_SCH_VOTES
     WRI$_SEGADV_ATTRIB
     WRI$_SEGADV_CNTRLTAB
     WRI$_SEGADV_OBJLIST
     WRI$_SQLMON_USAGE
     WRI$_SQLSET_BINDS
     WRI$_SQLSET_DEFINITIONS
     WRI$_SQLSET_MASK
     WRI$_SQLSET_PLANS
     WRI$_SQLSET_PLANS_TOCAP
     WRI$_SQLSET_PLAN_LINES
     WRI$_SQLSET_REFERENCES
     WRI$_SQLSET_STATEMENTS
     WRI$_SQLSET_STATISTICS
     WRI$_SQLSET_STS_TOPACK
     WRI$_SQLSET_WORKSPACE
     WRI$_SQLSET_WORKSPACE_PLANS
     WRI$_SQLTEXT_REFCOUNT
     WRI$_STS_GRANULES
     WRI$_STS_MASKING_ERRORS
     WRI$_STS_MASKING_EXCEPTIONS
     WRI$_STS_MASKING_STEP_PROGRESS
     WRI$_STS_SENSITIVE_SQL
     WRI$_TOPN_METADATA
     WRI$_TRACING_ENABLED
     
5 tables WRM$_***
     WRM$_ACTIVE_PDBS
     WRM$_PDB_IN_SNAP_BL
     WRM$_SNAPSHOT_DETAILS
     WRM$_WR_USAGE
     WRMS$_SNAPSHOT
     
50 tables WRR$_***
     WRR$_ASREPLAY_DATA
     WRR$_CAPTURES
     WRR$_CAPTURE_BUCKETS
     WRR$_CAPTURE_FILE_DETAILS
     WRR$_CAPTURE_STATS
     WRR$_CAPTURE_UC_GRAPH
     WRR$_COMMIT_FIRST_CALL_SCN
     WRR$_COMPONENT_TIMING
     WRR$_CONNECTION_MAP
     WRR$_FILE_ID_MAP
     WRR$_FILTERS
     WRR$_MASKING_BIND_CACHE
     WRR$_MASKING_DEFINITION
     WRR$_MASKING_FILE_PROGRESS
     WRR$_MASKING_PARAMETERS
     WRR$_REPLAYS
     WRR$_REPLAY_CALL_FILTER
     WRR$_REPLAY_CALL_INFO
     WRR$_REPLAY_CLIENTS
     WRR$_REPLAY_COMMITS
     WRR$_REPLAY_COMMIT_REMAPPING
     WRR$_REPLAY_CONN_DATA
     WRR$_REPLAY_DATA
     WRR$_REPLAY_DEP_GRAPH
     WRR$_REPLAY_DIRECTORY
     WRR$_REPLAY_DIVERGENCE
     WRR$_REPLAY_FILES
     WRR$_REPLAY_FILTER_SET
     WRR$_REPLAY_GROUP_ASSIGNMENTS
     WRR$_REPLAY_INSTANCES
     WRR$_REPLAY_LOGIN_QUEUE
     WRR$_REPLAY_REFERENCES
     WRR$_REPLAY_SCHEDULES
     WRR$_REPLAY_SCN_ORDER
     WRR$_REPLAY_SEQ_DATA
     WRR$_REPLAY_SQL_BINDS
     WRR$_REPLAY_SQL_MAP
     WRR$_REPLAY_SQL_TEXT
     WRR$_REPLAY_STATS
     WRR$_REPLAY_TRACKED_COMMITS
     WRR$_REPLAY_UC_GRAPH
     WRR$_SCHEDULE_CAPTURES
     WRR$_SCHEDULE_ORDERING
     WRR$_SEQUENCE_EXCEPTIONS
     WRR$_USER_MAP
     WRR$_WORKLOAD_ATTRIBUTES
     WRR$_WORKLOAD_EX_OBJECTS
     WRR$_WORKLOAD_GROUPS
     WRR$_WORKLOAD_REPLAY_THREAD
     WRR$_WORKLOAD_SESSIONS
     

============================================================================================
Conclusion

============================================================================================
OK on arrête là, l'objectif était de montrer comment automatiser une recherche sur le MPD à partir du MED, pas de dire à quoi servent les tables AWR non utilisées par les vues DBA_HIST***.

Maintenant on pourrait aussi, pour chaque table WRH$*** utilisées dans les vues DBA_HIST***, identifier quelles sont les colonnes non externalisées dans ces vues; peut-être un autre article prochainement :-)

Publicité
Publicité
Commentaires
Blog d'un DBA sur le SGBD Oracle et SQL
Publicité
Archives
Blog d'un DBA sur le SGBD Oracle et SQL
  • Blog d'un administrateur de bases de données Oracle sur le SGBD Oracle et sur les langages SQL et PL/SQL. Mon objectif est de vous faire découvrir des subtilités de ce logiciel, des astuces, voir même des surprises :-)
  • Accueil du blog
  • Créer un blog avec CanalBlog
Visiteurs
Depuis la création 339 403
Publicité