Datalbi  
Créé le 09/10/2015 par Laurent Bourcier

Oracle 12c Nouvelles Fonctionnalités : Extended Data Types

Introduction

Depuis Oracle 12.1.0, les types VARCHAR2 et NVARCHAR2 ne sont plus limités à 4000 octets. De même le type RAW n'est plus limités à 2000 octets.

La nouvelle limite est repoussée à 32767 octets.

Mise en oeuvre

Cette fonctionnalité n'est pas activée par défaut. Elle est pilotée par le paramètre d'initialisation max_string_size.

MAX_STRING_SIZE :
  - STANDARD (default)
  - EXTENDED

ALTER SYSTEM : autorisé sur un startup upgrade uniquement.

L'activation de ce paramètre est irréversible et nécessite un arrêt démarrage de la base de données.

SQL> show parameter max_string_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_string_size                      string      STANDARD

SQL> shutdown immediate;

SQL> startup upgrade;

SQL> alter system set max_string_size = 'EXTENDED';

SQL> @?/rdbms/admin/utl32k.sql

SQL> @?/rdbms/admin/utlrp

SQL> shutdown immediate;

SQL> startup;

SQL> show parameter max_string_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_string_size                      string      EXTENDED

Impacts du changement

Operation Création d'un LOB
Migration d'une base de STANDARD à EXTENDED NON
Création d'une table avec colonne de moins de 4000 octets sur une base EXTENDED NON
Altération de cette même table pour passer à plus de 4000 octets NON
Création d'une table avec une colonne de plus de 4000 octets sur une base EXTENDED OUI

Comme le montre le tableau ci-dessus, la création d'une table avec une colonne VARCHAR2 supérieure à 4000 octets entraine la création d'un segment LOB attaché à cette colonne, ainsi qu'un LOB index pour indexer ce LOB.

Par contre, une table créer de la même manière mais avec une colonne inférieure à 4000 ne crée pas de LOB. A la place, Oracle gère une liste chainée en interne.

Le fait d'augmentaer la taille de la colonne à une valeur supérieure à 4000 ne déclenche pas la création d'un LOB.

Enfin, une table existante avec MAX_STRING_SIZE=STANDARD ne créera pas de LOB une fois la base passée en MAX_STRING_SIZE=EXTENDED. A la place, Oracle gère une liste chainée en interne.

Vérification par la pratique :

-- Creation d'une table sur une base en Standard
CREATE TABLE TEST_BEFORE_EXTENDED(ID NUMBER, COMMENTS VARCHAR2(1000));

-- Vérification après migration en Extended de la base
select TABLE_NAME, COLUMN_NAME, SEGMENT_NAME, INDEX_NAME 
from USER_LOBS 
order by TABLE_NAME, COLUMN_NAME;

aucune ligne selectionnee

-- Creation d'une table avec colonne de moins de 4000 octets
CREATE TABLE TEST_AFTER_EXTENDED(ID NUMBER, COMMENTS VARCHAR2(1000));

select TABLE_NAME, COLUMN_NAME, SEGMENT_NAME, INDEX_NAME 
from USER_LOBS 
order by TABLE_NAME, COLUMN_NAME;

aucune ligne selectionnee

-- Augmentation de la taille de la colonne
ALTER TABLE TEST_AFTER_EXTENDED(COMMENTS VARCHAR2(32000));

select TABLE_NAME, COLUMN_NAME, SEGMENT_NAME, INDEX_NAME 
from USER_LOBS 
order by TABLE_NAME, COLUMN_NAME;

aucune ligne selectionnee

-- Creation d'une table avec colonne de plus de 4000 octets
CREATE TABLE TEST_AFTER_EXTENDED_2(ID NUMBER, COMMENTS VARCHAR2(32000));

select TABLE_NAME, COLUMN_NAME, SEGMENT_NAME, INDEX_NAME 
from USER_LOBS 
order by TABLE_NAME, COLUMN_NAME;

TABLE_NAME            COLUMN_NAME          SEGMENT_NAME                   INDEX_NAME
--------------------- -------------------- ------------------------------ ------------------------------
TEST_AFTER_EXTENDED_2 COMMENTS             SYS_LOB0000020586C00002$$      SYS_IL0000020586C00002$$