Example drop unused column

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Exemple DDL Oracle
Contexte Suppression de colonne en deux temps (SET UNUSED puis DROP)
Voir aussi Example create table · Example move table

Supprimer une colonne d'une grosse table avec ALTER TABLE ... DROP COLUMN directement peut être long et bloquant, car Oracle doit réécrire physiquement tous les blocs de la table. La technique en deux temps évite ce problème :

  1. SET UNUSED COLUMN marque la colonne comme inutilisée immédiatement
 (opération rapide, quasi instantanée) : elle disparaît des requêtes
 (SELECT *, dictionnaire de données) et devient inaccessible, mais reste
 physiquement présente dans les blocs.
  1. DROP UNUSED COLUMNS effectue ensuite la réécriture physique — l'opération
 lourde peut ainsi être planifiée séparément (fenêtre de maintenance), sans bloquer les accès
 entre les deux étapes.

La vue DBA_UNUSED_COL_TABS liste toutes les tables du schéma courant (ou de la base, selon les privilèges) comportant au moins une colonne marquée inutilisée mais pas encore physiquement supprimée — utile pour vérifier qu'aucune purge n'a été oubliée.

Script

CONNECT scott/tiger

SET SERVEROUTPUT ON

-- Table de test
DROP TABLE d_table
/

CREATE TABLE d_table (
    id_no     NUMBER
  , name      VARCHAR2(100)
  , d_column  VARCHAR2(100)
)
/

-- Étape 1 : marquer la colonne comme inutilisée (rapide, non bloquant)
ALTER TABLE d_table SET UNUSED COLUMN d_column;

-- Lister les tables ayant des colonnes marquées inutilisées mais pas encore purgées
SELECT * FROM dba_unused_col_tabs;

-- Étape 2 : purge physique de la/des colonne(s) marquée(s) inutilisée(s)
ALTER TABLE d_table DROP UNUSED COLUMNS;

Variantes

Suppression directe (sans passer par SET UNUSED) — à réserver aux petites tables ou aux environnements où l'indisponibilité n'est pas un problème :

ALTER TABLE d_table DROP COLUMN d_column;

Options supplémentaires disponibles sur DROP COLUMN comme sur DROP UNUSED COLUMNS :

-- Supprime aussi les contraintes référençant la colonne (clé étrangère notamment)
ALTER TABLE d_table DROP COLUMN d_column CASCADE CONSTRAINTS;

-- Invalide les vues/synonymes dépendants au lieu d'échouer
ALTER TABLE d_table DROP COLUMN d_column INVALIDATE;

-- Valide (commit) tous les 1000 lignes traitées, pour limiter la volumétrie undo/redo
-- sur une très grosse table
ALTER TABLE d_table DROP COLUMN d_column CHECKPOINT 1000;

Voir aussi