Perf objects without statistics

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic
Domaine Performance
Voir aussi Perf top 10 tables

Perf objects without statistics liste toutes les tables, index et partitions (de tables ou d'index) qui n'ont jamais eu de statistiques collectées (last_analyzed IS NULL), en excluant les schémas système SYS et SYSTEM. Des statistiques absentes ou périmées faussent les estimations du Cost-Based Optimizer et peuvent conduire à des plans d'exécution très sous-optimaux.

Script

SET LINESIZE 145
SET PAGESIZE 9999
SET VERIFY   OFF

COLUMN owner          FORMAT a17 HEAD 'Owner'
COLUMN object_type     FORMAT a15 HEAD 'Object Type'
COLUMN object_name     FORMAT a30 HEAD 'Object Name'
COLUMN partition_name  FORMAT a30 HEAD 'Partition Name'

SELECT owner, 'Table' object_type, table_name object_name, NULL partition_name
FROM   sys.dba_tables
WHERE  last_analyzed IS NULL
  AND  owner NOT IN ('SYS', 'SYSTEM')
  AND  partitioned = 'NO'
UNION
SELECT owner, 'Index' object_type, index_name object_name, NULL partition_name
FROM   sys.dba_indexes
WHERE  last_analyzed IS NULL
  AND  owner NOT IN ('SYS', 'SYSTEM')
  AND  partitioned = 'NO'
UNION
SELECT table_owner owner, 'Table Partition' object_type, table_name object_name, partition_name
FROM   sys.dba_tab_partitions
WHERE  last_analyzed IS NULL
  AND  table_owner NOT IN ('SYS', 'SYSTEM')
UNION
SELECT index_owner owner, 'Index Partition' object_type, index_name object_name, partition_name
FROM   sys.dba_ind_partitions
WHERE  last_analyzed IS NULL
  AND  index_owner NOT IN ('SYS', 'SYSTEM')
ORDER BY 1, 2, 3
/

Interprétation

  • Sur une base récente avec le job automatique de collecte des statistiques actif (GATHER_STATS_JOB/auto optimizer stats collection, activé par défaut depuis Oracle 10g), une liste vide ou courte est normale ; vérifier l'état du job via DBA_AUTOTASK_CLIENT si le résultat est inattendu.
  • Une liste longue et persistante malgré le job automatique peut signaler des tables créées puis chargées massivement en une seule transaction juste après la fenêtre de maintenance, ou un job désactivé (DBMS_AUTO_TASK_ADMIN).
  • Pour un contrôle plus fin sur des bases modernes, préférer DBA_TAB_STATISTICS.STALE_STATS qui détecte aussi les statistiques périmées (pas seulement absentes) en fonction du seuil de modification des lignes.
  • Traitement correctif standard : DBMS_STATS.GATHER_SCHEMA_STATS (ou GATHER_TABLE_STATS objet par objet) plutôt que l'ancien ANALYZE.

Voir aussi

  • Perf top 10 tables — identifie les tables les plus sollicitées, candidates naturelles à surveiller en priorité côté statistiques.