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.
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
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$$