Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment trouver une table où les statistiques sont verrouillées

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