Oracle嵌套表存储格式浅析

Oracle嵌套表很少用,下面来研究下其如何存储的。用一个例子,一个用户对应对个部门。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

SQL> create type t_dept as object(

dept_id number,

dept_name varchar2(20)

)

/

SQL> create type t_dept_arry as varray(100) of t_dept

/

SQL> create table t_user(

user_id number,

user_name varchar2(10),

depts t_dept_arry

)

/

SQL> insert into t_user values(1,‘张三‘,t_dept_arry(t_dept(100,‘开发一组‘),t_dept(200,‘开发二组‘)));

SQL> insert into t_user values(2,‘李四‘,t_dept_arry(t_dept(300,‘设计一组‘),t_dept(400,‘设计二组‘)));

SQL> commit;

--要想遍历用户的所有部门信息,需要用table这种特殊的形式

SQL> select user_id,user_name,d.dept_id,d.dept_name from t_user u,table(u.depts) d;

USER_ID USER_NAME     DEPT_ID DEPT_NAME

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

1 张三              100 开发一组

1 张三              200 开发二组

2 李四              300 设计一组

2 李四              400 设计二组

dump block看看:

block_row_dump:

tab 0, row 0, @0x3f47

tl: 81 fb: --H-FL-- lb: 0x1  cc: 3

col  0: [ 2]  c1 02

col  1: [ 4]  d5 c5 c8 fd

col  2: [69]

00 01 00 00 00 00 00 01 00 00 00 0a e4 23 00 37 09 00 00 00 00 00 00 27 00

00 00 00 00 01 88 01 27 01 01 00 02 0f 84 01 0f 02 c2 02 08 bf aa b7 a2 d2

bb d7 e9 0f 84 01 0f 02 c2 03 08 bf aa b7 a2 b6 fe d7 e9

tab 0, row 1, @0x3ef6

tl: 81 fb: --H-FL-- lb: 0x1  cc: 3

col  0: [ 2]  c1 03

col  1: [ 4]  c0 ee cb c4

col  2: [69]

00 01 00 00 00 00 00 01 00 00 00 0a e4 24 00 37 09 00 00 00 00 00 00 27 00

00 00 00 00 01 88 01 27 01 01 00 02 0f 84 01 0f 02 c2 04 08 c9 e8 bc c6 d2

bb d7 e9 0f 84 01 0f 02 c2 05 08 c9 e8 bc c6 b6 fe d7 e9

end_of_block_dump

insert into t_user values(3,‘王五‘,t_dept_arry(t_dept(500,‘家‘)));

commit;

block_row_dump:

tab 0, row 0, @0x3f5d

tl: 59 fb: --H-FL-- lb: 0x1  cc: 3

col  0: [ 2]  c1 04

col  1: [ 4]  cd f5 ce e5

col  2: [47]

00 01 00 00 00 00 00 01 00 00 00 0a e4 49 00 21 09 00 00 00 00 00 00 11 00

00 00 00 00 01 88 01 11 01 01 00 01 09 84 01 09 02 c2 06 02 bc d2

end_of_block_dump

--看了上面dump的结果,一头雾水,不知道是怎么存的,不过在user_objects中找到线索,有个lob字段

SQL> select object_name,object_type from user_objects s;

OBJECT_NAME                    OBJECT_TYPE

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

SYS_LOB0000082685C00003$$      LOB

T_USER                         TABLE

T_DEPT_ARRY                    TYPE

T_DEPT                         TYPE

SQL> select column_name, segment_name, index_name

from user_lobs s

where s.table_name = ‘T_USER‘;

COLUMN_NAM SEGMENT_NAME                   INDEX_NAME

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

DEPTS      SYS_LOB0000082685C00003$$      SYS_IL0000082685C00003$$

--再测试下跟普通的clob有什么区别

drop table test purge;

create table test

(

id number,

t_clob clob

);

insert into test values(1,‘开发一组开发二组‘);

insert into test values(1,‘设计一组设计二组‘);

insert into test values(1,‘家‘);

commit;

tab 0, row 0, @0x3f5d

tl: 59 fb: --H-FL-- lb: 0x1  cc: 2

col  0: [ 2]  c1 02

col  1: [52]

00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 0a e4 4a 00 20 09 00 00

00 00 00 00 10 00 00 00 00 00 01 5f 00 53 d1 4e 00 7e c4 5f 00 53 d1 4e 8c

7e c4

LOB

Locator:

Length:        84(52)

Version:        1

Byte Length:    2

LobID: 00.00.00.01.00.00.00.0a.e4.4a

Flags[ 0x02 0x0c 0x80 0x00 ]:

Type: CLOB

Storage: BasicFile

Enable Storage in Row

Characterset Format: IMPLICIT

Partitioned Table: No

Options: VaringWidthReadWrite

Inode:

Size:     32

Flag:     0x09 [ Valid DataInRow ]

Future:   0x00 (should be ‘0x00‘)

Blocks:   0

Bytes:    16

Version:  00000.0000000001

Inline data[16]

Dump of memory from 0x00002AE680C155EC to 0x00002AE680C155FC

2AE680C155E0                            D153005F              [_.S.]

2AE680C155F0 C47E004E D153005F C47E8C4E           [N.~._.S.N.~.]

tab 0, row 1, @0x3f22

tl: 59 fb: --H-FL-- lb: 0x1  cc: 2

col  0: [ 2]  c1 02

col  1: [52]

00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 0a e4 4b 00 20 09 00 00

00 00 00 00 10 00 00 00 00 00 01 8b be 8b a1 4e 00 7e c4 8b be 8b a1 4e 8c

7e c4

LOB

Locator:

Length:        84(52)

Version:        1

Byte Length:    2

LobID: 00.00.00.01.00.00.00.0a.e4.4b

Flags[ 0x02 0x0c 0x80 0x00 ]:

Type: CLOB

Storage: BasicFile

Enable Storage in Row

Characterset Format: IMPLICIT

Partitioned Table: No

Options: VaringWidthReadWrite

Inode:

Size:     32

Flag:     0x09 [ Valid DataInRow ]

Future:   0x00 (should be ‘0x00‘)

Blocks:   0

Bytes:    16

Version:  00000.0000000001

Inline data[16]

Dump of memory from 0x00002AE680C155B1 to 0x00002AE680C155C1

2AE680C155B0 8BBE8B01 7E004EA1 8BBE8BC4 7E8C4EA1  [.....N.~.....N.~]

2AE680C155C0 02012CC4                             [.,..]

tab 0, row 2, @0x3ef5

tl: 45 fb: --H-FL-- lb: 0x1  cc: 2

col  0: [ 2]  c1 02

col  1: [38]

00 54 00 01 02 0c 80 00 00 02 00 00 00 01 00 00 00 0a e4 4c 00 12 09 00 00

00 00 00 00 02 00 00 00 00 00 01 5b b6

LOB

Locator:

Length:        84(38)

Version:        1

Byte Length:    2

LobID: 00.00.00.01.00.00.00.0a.e4.4c

Flags[ 0x02 0x0c 0x80 0x00 ]:

Type: CLOB

Storage: BasicFile

Enable Storage in Row

Characterset Format: IMPLICIT

Partitioned Table: No

Options: VaringWidthReadWrite

Inode:

Size:     18

Flag:     0x09 [ Valid DataInRow ]

Future:   0x00 (should be ‘0x00‘)

Blocks:   0

Bytes:    2

Version:  00000.0000000001

Inline data[2]

选取两次的dump的内容,不过还是不能确定两者是否等价:

00 01 00
00 00 00 00
01 00 00 00 0a e4
49 00 21 09 00 00 00 00 00 00 11 00

00 00 00 00 01 88 01 11 01 01 00 01 09 84 01 09 02 c2 06 02 bc d2

00 54 00 01 02 0c 80 00 00 02
00 00 00 01 00 00 00 0a e4 4c 00 12 09 00 00

00 00 00 00 02 00 00 00 00 00 01 5b b6

总结:嵌套是通过lob在存储嵌套的内容的,TOM说作为一种存储机制,他更倾向于创建父子表,可以再创建一个视图,看上去像一个真正的嵌套表一样,嵌套表适合于编程构造。

时间: 09-10

Oracle嵌套表存储格式浅析的相关文章

oracle 嵌套表

--自定义对象 CREATE OR REPLACE TYPE Fas_checksheetinfo_line_obj AS OBJECT(  CSID_ID           VARCHAR2(32),--报账单明细ID  CSI_ID            VARCHAR2(32),--报账单ID  CSID_GENERATEDATE DATE,        --费用发生日期  CSID_TYPE         VARCHAR2(32),--费用类型  CSID_SUMMARY     

oracle的number的浅析

author:skate time:2011-02-14 oracle的number的浅析 从例如以下几个方面来认识number 1.表示的数值范围   2.占用的存储空间   3.number的性能 我们日常主要定义数值存储列是大都是用number,只是oracle也兼容一些以他类型,例如以下: NUMERIC(p,s):全然映射至NUMBER(p,s).假设p未指定,则默觉得38.DECIMAL(p,s)或DEC(p,s):全然映射至NUMBER(p,s).假设p为指定,则默觉得38.INT

嵌套表用法详解(PLSQL)

嵌套表 嵌套表是一种类似于索引表的结构,也可以用于保存多个数据,而且也可以保存复合类型的数据 嵌套表指的是一个数据表定义事同时加入了其他内部表的定义,这一概念是在oracle 8中引入的,它们可以使用SQL进行访问,也可以进行动态扩展. 创建表指定嵌套表存储空间名称 Create table 表名称( 字段名称 类型 -- 嵌套表字段名称 嵌套表类型 )NESTED TABLE 嵌套表字段名称 STORE AS 存储空间名称: 定义部门表 DROP TABLE department Create

oracle热点表online rename

对于在线的繁忙业务表的任何操作都可能带来意想不到的风险.一张业务表,对partition key进行升位,其步骤是: rename原表 新建临时表 交换分区到临时表 升位临时表的字段的长度 交换临时表到第二张临时表 rename第二种临时表为业务表 整个的操作过程如果顺利,预计在10s左右,如果放在文件中,速度会很快.下面模拟繁忙表进行测试: #!/bin/sh . /home/oracle/.bash_profile sqlplus -S /nolog<<EOF conn test/test

oracle 11G表压缩

最近一套生产库表空间一直告警在90%以上,但的磁盘硬件资源又不足,整个库已经达到26T.库里存储了近4年的数据,与业务沟通说历史数据基本上不会做操作,但是又不能归档,所以想到了压缩表来节省表空间. 随着数据库的增长,我们可以考虑使用oracle的表压缩技术.表压缩可以节省磁盘空间.减少data buffer cache的内存使用量.并可以显著的提升读取和查询的速度.当使用压缩时,在数据导入和DML操作时,将导致更多的CPU开销,然而,由于启用压缩而减少的I/O需求将抵消CPU的开销而产生的成本.

Oracle Temp 表空间切换

一.TEMP表空间作用 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理.当 oracle 里需要用到 sort 的时候, PGA 中 sort_area_size 大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间 , 正常来说,在完成 Select 语句.create index 等一些使用 TEMP 表空间的排序操作后, Oracle 是会自动释放掉临时段的.注意这里的释放,仅仅是

Oracle 重建表(rename)注意事项总结

一.概述 前一段时间,有一个DBA朋友在完成重建表(rename)工作后,第二天早上业务无法正常运行,出现数据无法插入的限制和错误,后来分析才发现,错误的原因是使用rename方式重建表以后,其它引用这个表的外键约束指向没有重新定义到这个重建的新表中,从而导致这些表在插入新数据时,违反数据完整性约束,导致数据无法正常插入.影响了业务大概有1个多小时,真是一次血淋淋的教训啊. 使用rename方式重建表是我们日常DBA维护工作中经常使用的一种方法,因为CTAS+rename这种配合方式,非常实用和

java 操作oracle 建表,更新记录

1.  建立表的类 import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.PreparedStatement; public class lx01{ public static void main(String[] args) throws SQLException, ClassNotFoundE

Oracle建立表空间和用户

建立表空间和用户的步骤: 用户 建立:create user username identified by "password"; 授权:grant create session to username; grant create table to username; grant create tablespace to username; grant create view to username; 表空间 建立表空间(一般建N个存数据的表空间和一个索引空间): create tab