Dba row size

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic
Domaine Administration (dimensionnement)
Voir aussi Dba table info · Dba tables query user

Dba row size calcule, colonne par colonne, la taille maximale théorique d'une ligne pour toutes les tables d'un schéma donné. Utile pour estimer le nombre de lignes par bloc, dimensionner un PCTFREE/PCTUSED ou anticiper un chaînage de lignes (row chaining) sur des tables larges.

Script

-- Calcule la taille (en octets) de chaque colonne pour toutes les tables
-- d'un schéma, avec un total par table.

SET TERMOUT OFF
COLUMN current_instance NEW_VALUE current_instance NOPRINT
SELECT rpad(instance_name, 17) current_instance FROM v$instance;
SET TERMOUT ON

PROMPT
PROMPT +------------------------------------------------------------------------+
PROMPT | Report   : Calculate Row Size for Tables in a Specified Schema         |
PROMPT | Instance : &current_instance                                          |
PROMPT +------------------------------------------------------------------------+

PROMPT
ACCEPT schema PROMPT 'Enter schema name : '

SET ECHO      OFF
SET FEEDBACK  6
SET HEADING   ON
SET LINESIZE  180
SET PAGESIZE  50000
SET TRIMSPOOL ON
SET VERIFY    OFF

CLEAR COLUMNS
CLEAR BREAKS
CLEAR COMPUTES

COLUMN tot_size  FORMAT 99,999
COLUMN data_type FORMAT a15

BREAK ON table_name SKIP 2
COMPUTE SUM OF tot_size ON table_name

SELECT
    table_name
  , column_name
  , DECODE(   data_type
            , 'NUMBER',   NVL(data_precision, 38) + NVL(data_scale, 0)
            , 'VARCHAR2', data_length
            , 'VARCHAR',  data_length
            , 'CHAR',     data_length
            , 'DATE',     data_length
                          -- tout autre type (LONG, CLOB, BLOB, RAW,
                          -- TIMESTAMP...) : on retombe sur data_length
                          , data_length
    ) tot_size
  , data_type
FROM      dba_tab_columns
WHERE     owner = UPPER('&schema')
ORDER BY  table_name
        , column_id
/

Corrections apportées

  • La version d'origine ne prévoyait pas de valeur par défaut dans le DECODE : toute colonne d'un type non explicitement listé (LONG, CLOB, BLOB, RAW, TIMESTAMP...) remontait NULL, faussant silencieusement le total par table. Un cas par défaut (data_length) a été ajouté.
  • Pour les colonnes NUMBER déclarées sans précision explicite (NUMBER seul), data_precision et data_scale sont à NULL : l'addition data_precision+data_scale d'origine remontait donc NULL au lieu d'une taille. Ajout de NVL(data_precision, 38) (précision maximale d'un NUMBER) et NVL(data_scale, 0).
  • Le script comportait également un second COMPUTE SUM OF data_length ON table_name portant sur une colonne absente du SELECT (seul l'alias tot_size est projeté) : cette ligne, sans effet utile, a été supprimée.

Colonnes / sortie

  • TOT_SIZE — taille estimée de la colonne (en octets pour les types caractère/date, précision+échelle pour NUMBER).
  • Le total par table (BREAK/COMPUTE) donne une approximation de la taille maximale d'une ligne — approximation seulement, car la plupart des lignes réelles sont plus courtes (colonnes NULL, VARCHAR2 non remplis à leur longueur déclarée).

Voir aussi