Hoe lang is een extended varchar2?

Hoe lang is een extended varchar2?

Nadat in Oracle 8 de maximale lengte van een varchar2 van 2000 naar 4000 is vergroot is in Oracle 12 opnieuw een wijziging bij het varchar2 datatype doorgevoerd: het extended varchar2 type is geïntroduceerd. Hiermee is de maximale lengte van de varchar2 kolom tot 32K verlengd. Hiervoor is een onomkeerbare configuratie wijziging in de database nodig. Deze vereist dat de init.ora parameter MAX_STRING_SIZE op EXTENDED gezet worden en het script ~/rdbms/admin/utl32k.sql moet gedraaid worden.

Zodra deze verbouwing is gedaan kunnen varchar2 kolommen op tot 32k i.p.v.  de standaard 4000 bytes gemaakt worden:

SQL> create table SCOTT.test (a varchar2(6000));

SQL> desc SCOTT.test;
Name 		Null?  Type
-------------- ------ --------------------- 
A 			VARCHAR2(6000)

Nu de tabel gemaakt is de vraag wat of we inderdaad meer dan de 4000 bytes kunnen

SQL> insert into SCOTT.test values('1');

SQL> update SCOTT.test set a=rpad(a, 6000,'2');

SQL> commit;

SQL> update SCOTT.test set a=rpad(a, 6001,'3')

ERROR at line 1:
ORA-12899: value too large for column "SCOTT"."TEST"."A" (actual: 6001,maximum: 6000)

Hiermee is duidelijk dat we inderdaad 6000 posities kwijt kunnen en niet tot de oude 4000 beperkt zijn.  Een interessante vraag is hoe wordt deze varchar2 kolom opgeslagen?

Traditioneel worden de kolommen in een tabel sequentieel opgeslagen.  Hiermee kan en rij bijvoorbeeld met meerdere varchar2(4000)  kolommen best lang worden. Dit heeft potentieel performance consequenties.  Dit is een van de redenen waarom, afhankelijk van een threshold LOB-structuren ‘out-of-line of inline worden opgeslagen op basis van de LOB_PARAMETER. Hiermee worden de (grote) LOB apart opgeslagen en kan row chaining potentieel voorkomen worden. En dat is weer goed voor de performance.  Vraag is nu wat gebeurt er bij een extended varchar2 kolom. Een simpele query geeft het antwoord:

SQL> select table_name, column_name,SEGMENT_NAMEfrom dba_lobs where owner='SCOTT'

TABLE_NAME        COLUMN_NAME     SEGMENT_NAME
---------------- ---------------- ---------------------------
TEST             A                SYS_LOB0000074302C00001$$

SQL> select owner, object_name from dba_objects where object_id=74302;

OWNER          OBJECT_NAME
-------------- -----------------------------------------------------------------
SCOTT       TEST

Het is dus duidelijk dat een extended varchar2 kolom intern ook als een LOB wordt opgeslagen echter, het toont zich als een varchar2.  Legitieme vraag is nu kies je voor een LOB of voor een extended varchar2 als een kolom meer dan 4000 karakters nodig heeft.  Deze vraag heeft niet echt een eenduidig antwoord.  Enkele overwegingen  die bij het besluit een rol spelen:

  • weet je zeker dat de 32K  van het extended varchar2 type voldoende is?
  • Wat zijn de afhankelijkheden van de PL/SQL Varchar2 datatype of bijvoorbeeld Mysql?
  • Hoe flexibel is je code mbt varchar2 vs CLOB.
  • Wat zijn de performance eisen. Er zijn tests die een licht verschil in performance doen vermoeden.

Deze aspecten zullen verschillend zijn voor verschillende applicatiesystemen. Maar het verdiend zeker de tijd er over na te denken.

We hopen dat we je met dit artikel, Hoe lang is een extended varchar2?, op weg hebben geholpen. Mocht je hulp nodig hebben of je hebt vragen n.a.v. dit artikel, laat het ons dan weten.

Gerelaateerd aan dit artikel: lees ook Oracle 19 New Features

Scroll to Top