Les LOBs et leurs index

Oracle contient son lot de bizarreries. Parmi elles, la syntaxe de création de l’index d’un LOB qui accepte une clause tablespace en 10.2 et 11.2 ainsi qu’une clause storage mais qui s’assoit dessus… En voici l’illustration:

create table x(id number,
text clob)
storage (initial 1024k)
tablespace system
lob(text)
store as x_lob(
storage (initial 1024k)
tablespace users
index x_lobix (
storage (initial 1024k)
tablespace system)
);

col segment_name format a7
select segment_name, initial_extent, tablespace_name
from dba_segments
where (segment_name,owner, segment_type) in
(('X_LOBIX', user, 'LOBINDEX'),
('X_LOB', user, 'LOBSEGMENT'),
('X', user, 'TABLE'),
('X_IX', user, 'INDEX'));

SEGMENT INITIAL_EXTENT TABLESPACE_NAME
------- -------------- ---------------
X 1048576 SYSTEM
X_LOB 1048576 USERS
X_LOBIX 65536 USERS

L’explication quant à la clause tablespace est dans la section pertinente de la documentation. Celle-ci indique, en effet, que le segment LOB et son index doivent être dans le même tablespace. Je n’ai pas trouvé d’explication quant à la clause storage; pourtant celle-ci semble prendre évidemment les paramètres du tablespace; au moins avec un tablespace LMT et une allocation automatique sur 11.2.0.1/Linux x86 ! Le phénomène est identique lorsque vous déplacez tables et LOB; même causes, même conséquences ?

alter table x move
lob(text)
store as x_lob(
storage (initial 1024k)
tablespace users
index x_lobix (
storage (initial 1024k)
tablespace system)
);

col segment_name format a7
select segment_name, initial_extent, tablespace_name
from dba_segments
where (segment_name,owner, segment_type) in
(('X_LOBIX', user, 'LOBINDEX'),
('X_LOB', user, 'LOBSEGMENT'),
('X', user, 'TABLE'),
('X_IX', user, 'INDEX'));

SEGMENT INITIAL_EXTENT TABLESPACE_NAME
------- -------------- ---------------
X 1048576 SYSTEM
X_LOB 1048576 USERS
X_LOBIX 65536 USERS

Si vous arrivez à trouver la référence indiquant la restriction concernant la clause storage, je suis intéressé. Sinon, supprimez simplement la clause pour rendre l’information plus lisible:

create table x(id number,
text clob)
storage (initial 1024k)
tablespace system
lob(text)
store as x_lob(
storage (initial 1024k)
tablespace users
index x_lobix (storage (initial 1024k) tablespace system)
);

Supprimez ensuite la table de démonstration:


drop table x purge;

Cela dit, la clause INDEX de LOB_storage_clause n’est même pas référencée dans la documentation produit alors…