Oracle数据库LOB字段删除数据后空间占用测试
"该文档是关于Oracle数据库中LOB字段(Large Object)的存储与空间管理的测试案例。主要探讨了两种不同的存储模式:1) 'disable storage in row' 模式,以及2) 默认模式(非'disable storage in row')。在测试中,创建了一个名为T_LOB_TEST的表,包含一个BLOB类型的lob_content字段和一个VARCHAR2类型的comm字段,用于存储XML数据。通过插入大量数据并执行删除操作,观察空间占用的变化情况。" 在Oracle数据库中,LOB字段用来存储大对象数据,如图像、音频、视频或大文本文件等。LOB字段的存储方式有多种,包括BFILE、BLOB、CLOB和NCLOB,分别对应二进制文件、二进制大对象、字符大对象和国家字符集的大对象。 测试1涉及的是“disable storage in row”模式。在这个模式下,LOB数据不会被存储在行内,而是单独存储在LOB段中。通过`CREATE TABLE`语句创建了表T_LOB_TEST,并使用`disable storage in row nocache logging`选项定义了LOB字段xml_content的存储方式。然后,使用PL/SQL循环插入了1000条数据,每条数据包含一个1000长度的字符串转换成的BLOB值。插入完成后,查询了表和相关LOB段的空间占用,发现表T_LOB_TEST占用64KB,而LOB段占用9216KB。接着,删除了部分数据并提交事务,再次查询空间占用,以分析删除操作对空间的影响。 测试2默认模式下,Oracle会根据数据大小决定是否将LOB数据存储在行内。如果数据小于4KB,则存储在行内,否则存储在LOB段中。在这种情况下,小于4KB的XML数据会被直接存储在表中,而大于4KB的数据则会存储在LOB段。这个模式可以节省主表的空间,但可能会增加索引和LOB段的大小。 通过这些测试,我们可以了解Oracle数据库在处理LOB字段时如何管理空间,以及删除操作对存储的影响。对于大型LOB字段,即使删除了数据,可能仍需保留一定的空间用于记录元数据。在设计数据库表结构时,理解这些机制可以帮助优化空间使用,尤其是在处理大量LOB数据时。
--测试1 测试disable storage in row下的lob字段
--create table
create table T_LOB_TEST
(
id number(10) not null,
xml_content BLOB,
comm VARCHAR2(5)
)
lob(xml_content) store as
(disable storage in row
nocache logging)
;
declare
i number(10);
begin
for i in 1..1000
loop
insert into T_LOB_TEST values(i,to_blob('11111000011111000100001110000101010101000001000000011111100000000000000000111111111111100000000111111'),'comm');
end loop;
commit;
end;
/
select segment_name,bytes/1024 from user_segments where segment_name='T_LOB_TEST'
or segment_name in (select segment_name from user_lobs where table_name='T_LOB_TEST')
or segment_name in (select index_name from user_lobs where table_name='T_LOB_TEST');
SEGMENT_NAME BYTES/1024
T_LOB_TEST 64
SYS_IL0000346640C00002$$ 128
SYS_LOB0000346640C00002$$ 9216
SQL> delete from T_LOB_TEST where id>200;
800 rows deleted
SQL> commit;
Commit complete
SQL>
select segment_name,bytes/1024 from user_segments where segment_name='T_LOB_TEST'
or segment_name in (select segment_name from user_lobs where table_name='T_LOB_TEST')
or segment_name in (select index_name from user_lobs where table_name='T_LOB_TEST');
SEGMENT_NAME BYTES/1024
T_LOB_TEST 64
SYS_IL0000346640C00002$$ 128
SYS_LOB0000346640C00002$$ 9216
剩余6页未读,继续阅读
- 粉丝: 26
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++多态实现机制详解:虚函数与早期绑定
- Java多线程与异常处理详解
- 校园导游系统:无向图实现最短路径探索
- SQL2005彻底删除指南:避免重装失败
- GTD时间管理法:提升效率与组织生活的关键
- Python进制转换全攻略:从10进制到16进制
- 商丘物流业区位优势探究:发展战略与机遇
- C语言实训:简单计算器程序设计
- Oracle SQL命令大全:用户管理、权限操作与查询
- Struts2配置详解与示例
- C#编程规范与最佳实践
- C语言面试常见问题解析
- 超声波测距技术详解:电路与程序设计
- 反激开关电源设计:UC3844与TL431优化稳压
- Cisco路由器配置全攻略
- SQLServer 2005 CTE递归教程:创建员工层级结构