Les statistiques ont joué un rôle clé dans le réglage des performances d'Oracle. Oracle Optimizer crée le plan d'exécution en fonction des statistiques de la table oracle impliquée dans les requêtes SQL.
Vous voudrez peut-être verrouiller les statistiques dans une table oracle dans certains cas, par exemple
- vous ne souhaitez pas qu'une table soit analysée par tâche de statistiques de planification, mais souhaitez l'analyser plus tard ou selon une estimation plus élevée
- vous ne souhaitez pas générer les statistiques du tableau pour des raisons de performances
- vous ne voulez pas que le serveur passe du temps à générer des statistiques lorsque les données du tableau ne changent pas
Il pourrait y avoir beaucoup plus de cas où nous voudrions verrouiller les statistiques
Table des matières
- Comment verrouiller les statistiques sur la table
- Comment trouver une table où les statistiques sont verrouillées
- Exécution de la tâche de génération de statistiques sur la table où les statistiques sont verrouillées
- Comment déverrouiller les statistiques pour la table et le schéma/déverrouiller les statistiques de la table pour le schéma
- Création d'index avec statistiques verrouillées sur la table
Comment verrouiller les statistiques sur le tableau
Vous pouvez utiliser le package oracle standard DBMS_STATS pour verrouiller les statistiques sur la table
exec dbms_stats.lock_table_stats('table_owner','table_name');
Example SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH'; STATTYPE_LOCKED —–------------ exec dbms_stats.lock_table_stats('TEST','TECH'); SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH'; STATTYPE_LOCKED —–-------- ALL
Comment trouver une table où les statistiques sont verrouillées
Vous pouvez utiliser la requête ci-dessous pour trouver toutes les tables où les statistiques sont verrouillées
select owner, table_name, stattype_locked from dba_tab_statistics where stattype_locked is not null;
Exécution de la tâche de génération de statistiques sur la table où les statistiques sont verrouillées
Si nous essayons d'exécuter des statistiques de collecte sur les tables où les statistiques sont verrouillées, nous obtenons ORA-20005 les statistiques d'objet sont verrouillées (stattype =all)
SQL> exec dbms_stats.gather_table_stats('TECH', 'TEST'); BEGIN dbms_stats.gather_table_stats('TECH', 'TEST'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at “SYS.DBMS_STATS”, line 10640 ORA-06512: at “SYS.DBMS_STATS”, line 10664 ORA-06512: at line 1
Nous pouvons effectuer les étapes ci-dessous pour déverrouiller les statistiques et générer les statistiques et verrouiller à nouveau
exec dbms_stats.unlock_table_stats('TECH','TEST'); exec dbms_stats.gather_table_stats('TECH', 'TEST'); exec dbms_stats.lock_table_stats('TECH','TEST'); or exec dbms_stats.gather_table_stats('TECH', 'TEST',force=>true);
Comment déverrouiller les statistiques pour la table et le schéma/déverrouiller les statistiques de la table pour le schéma
Maintenant, une fois que nous avons découvert les objets, nous pouvons utiliser les requêtes ci-dessous pour les déverrouiller
unlock table stats for schema exec dbms_stats.unlock_schema_stats('schema_owner'); exec dbms_stats.unlock_table_stats('table_owner','table_name'); Example exec dbms_stats.unlock_schema_stats('TECH'); exec dbms_stats.unlock_table_stats('TECH','TEST');
Création d'index avec statistiques verrouillées sur la table
À partir de la version 10g, chaque fois que nous créons un index, les statistiques sont générées automatiquement. Maintenant, cette équation change. Lorsque la table est verrouillée, les statistiques ne sont pas générées lors de la création de l'index. Nous devons utiliser l'option FORCE pour rassembler les statistiques lors de la création d'un index pour les objets verrouillés. Permet de comprendre cela en détail en voyant l'exemple
Example Lets first create the dummy table and lock the statistics on that table SQL> create table test as select a.* ,rownum id from all_objects a where rownum <1001; SQL> exec dbms_stats.lock_table_stats('TECH','TEST'); Now we will try to create index SQL> create index test_idx on test(id); Index created. SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='TEST_IDX'; NUM_ROWS LAST_ANAL ---------- --------- So statistics on index is not generated automatically for the locked statistics table Lets try to generate the statistics using DBMS_STATS SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX'); BEGIN dbms_stats.gather_index_stats(null, 'TEST_IDX'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at "SYS.DBMS_STATS", line 10640 ORA-06512: at "SYS.DBMS_STATS", line 10664 ORA-06512: at line 1 So statistics generation failed. In order to generate stats on the index, We can use force option in dbms_stats to override this SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX',force=>true); PL/SQL procedure successfully completed. SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='IDX'; NUM_ROWS LAST_ANAL ---------- --------- 1000 01-SEP-17 Lets try to create a new index with compute statistics clause SQL> create index TEST_IDX1 on test(object_name) compute statistics; create index idx on test(object_name) compute statistics * ERROR at line 1: ORA-38029: object statistics are locked So ORA-38029 error happens, So we need to create index with out the compute statistics clause and then generate stats using force option SQL> create index TEST_IDX1 on test(object_name); SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true); Same things happens if we rebuild the index with compute statistics option SQL> alter index TEST_IDX1 rebuild compute statistics; alter index TEST_IDX1 rebuild compute statistics * ERROR at line 1: ORA-38029: object statistics are locked SQL> alter index TEST_IDX1 rebuild; Index altered. SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true); PL/SQL procedure successfully completed.
J'espère que vous aimez les informations sur la façon de verrouiller/déverrouiller les statistiques des tables dans Oracle. Maintenant, vous devez également savoir quoi faire lorsque ORA-20005 :les statistiques d'objet sont verrouillées et ORA-38029 :statistiques d'objets sont verrouillés arrive
Articles connexes
Collecte de statistiques dans les versions 11i et R12
Collecte de statistiques incrémentielles dans 11g
ora-20001 dans Gather schema stats on 11g(FND_HISTOGRAM_COLS)
Comment définir la surveillance des tables dans Oracle et la relation avec STATISTICS_LEVEL
Tutoriel Oracle :Comment vérifier les statistiques obsolètes
Mode Oracle Optimizer
Documentation Oracle sur les statistiques