Dba blocks used by table

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic
Domaine Tables / stockage
Voir aussi Base infos

Dba blocks used by table calcule le nombre réel de blocs non vides occupés par une table, à distinguer du high water mark (nombre de blocs déjà utilisés au moins une fois) que renvoie ANALYZE TABLE. La pseudo-colonne ROWID de chaque ligne encode la position physique de la ligne sous la forme bloc.ligne.fichier ; il suffit donc de compter les couples (bloc, fichier) distincts parmi les ROWID de la table pour obtenir le nombre de blocs réellement porteurs de données.

Deux syntaxes sont nécessaires selon la version d'Oracle car le format interne du ROWID a changé entre Oracle 7 et Oracle 8 (passage au ROWID étendu, compatible tablespaces multi-fichiers avec plus de fichiers).

Script

-- Nombre de blocs reellement utilises (non vides) par une table
-- A executer avec &table_name = nom de la table a analyser

-- Oracle 7 (ancien format de ROWID)
SELECT
    COUNT(DISTINCT (SUBSTR(rowid, 1, 8) || SUBSTR(rowid, 15, 4)))
FROM
    &table_name
/

-- Oracle 8 et superieur (ROWID etendu, via DBMS_ROWID)
SELECT
    COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) || DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"
FROM
    &table_name
/

-- Oracle 8 et superieur - variante equivalente (sous-chaine du ROWID etendu)
SELECT
    COUNT(DISTINCT SUBSTR(rowid, 1, 15)) "Used"
FROM
    &table_name
/

Colonnes / sortie

  • Résultat = nombre de blocs distincts contenant au moins une ligne de la table.
  • Différence avec le high water mark d'ANALYZE TABLE : ce dernier compte tous les blocs déjà alloués/utilisés un jour, y compris ceux redevenus vides après suppression de lignes ; ce script ne compte que les blocs actuellement porteurs de données.
  • Les deux variantes Oracle 8+ (DBMS_ROWID et SUBSTR) sont équivalentes en résultat ; la première est plus lisible, la seconde plus rapide sur de gros volumes.

Voir aussi

  • Base infos — informations générales sur la base contenant la table analysée