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 :-)