Oracle Xmltype类型浅析(2)

我们研究lob类型,在定义数据表的时候是有专门的lob(xxx)子句用于指定lob的一些存储信息。而在xmltype中,也存在这样的接口方式吗?我们使用dbms_metadata包抽取出数据表的元数据信息。

CREATE TABLE "SCOTT"."T"

( "ID" NUMBER,

"CL" "SCOTT"."XMLTYPE"

) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

TABLESPACE "USERS"

XMLTYPE COLUMN "CL" STORE AS CLOB (

TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10

NOCACHE LOGGING

STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)) ;

注意,此处是使用xmltype column xx store as clob子句进行定义。后面的关于storage的内容都是针对虚拟Lob列段对象而言的。

这里,我们反过来想,如果我们使用xmltype column子句,是不是也可以在定义数据表的过程就将Lob与数据表存储分开,放置在不同的表空间里。

4、创建xmltype表到不同表空间

借助xmltype column子句,我们可以实现在数据表建表阶段,就将Lob相关段和数据表分开。

SQL> create table t (id number, cl xmltype) tablespace users  XMLTYPE COLUMN "CL" STORE AS CLOB (tablespace example);

Table created

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME                  SEGMENT_TYPE      TABLESPACE

------------------------------ ------------------ ----------

T                              TABLE              USERS

SYS_IL0000056132C00003$$      LOBINDEX          EXAMPLE

SYS_LOB0000056132C00003$$      LOBSEGMENT        EXAMPLE

9 rows selected

SQL> select table_name, column_name,SEGMENT_NAME, TABLESPACE_NAME, INDEX_NAME from user_lobs;

TABLE_NAME COLUMN_NAME          SEGMENT_NAME                  TABLESPACE INDEX_NAME

---------- -------------------- ------------------------------ ---------- ------------------------------

T          SYS_NC00003$        SYS_LOB0000056132C00003$$      EXAMPLE    SYS_IL0000056132C00003$$

如我们所希望的,数据表和Lob段(数据段和索引段)分别放置在了不同表空间里。

5、数据表Move操作

数据表move操作可以实现将数据表段和相关段对象转移到其他表空间或者收缩的作用。对包含xmltype列的数据表,move操作效果如何呢?

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME                  SEGMENT_TYPE      TABLESPACE

------------------------------ ------------------ ----------

T                              TABLE              USERS

SYS_LOB0000056136C00003$$      LOBSEGMENT        USERS

SYS_IL0000056136C00003$$      LOBINDEX          USERS

9 rows selected

SQL> alter table t move tablespace example;

Table altered

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME                  SEGMENT_TYPE      TABLESPACE

------------------------------ ------------------ ----------

SYS_LOB0000056136C00003$$      LOBSEGMENT        USERS

SYS_IL0000056136C00003$$      LOBINDEX          USERS

T                              TABLE              EXAMPLE

9 rows selected

发现在Oracle 10g下,如果单纯的使用move命令,段效果变化同一般的lob类型是一样的。数据表T移动到了新的表空间位置,而对应的lob段没有变化。同时,还要注意,lob索引的状态保持valid状态。

SQL> select index_name, index_type, table_name, status from user_indexes where table_owner='SCOTT' and table_name='T';

INDEX_NAME                    INDEX_TYPE                  TABLE_NAME STATUS

------------------------------ --------------------------- ---------- --------

SYS_IL0000056136C00003$$      LOB                        T          VALID

如果我们尝试使用move lob命令会如何呢?

//普通调用无效,因为cl不是一个lob类型;

sQL> alter table t move lob(cl) store as xmlseg tablespace example;

alter table t move lob(cl) store as xmlseg tablespace example

ORA-00904: "CL": 标识符无效

//尝试移动隐含列对象;

SQL> alter table t move lob(SYS_NC00003$) store as mt (tablespace example);

Table altered

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME                  SEGMENT_TYPE      TABLESPACE_NAME

------------------------------ ------------------ ------------------------------

T                              TABLE              EXAMPLE

SYS_IL0000056136C00003$$      LOBINDEX          EXAMPLE

MT                            LOBSEGMENT        EXAMPLE

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a0c5ade15cbbb76ae0714ce921f34bd6.html