--LOB浅析(CLOB/BCLOB/NCLOB)--Oracle中支持4种类型的LOB
/*
CLOB:字符LOB,用于存储大量的文本信息。
NCLOB:另一种类型的字符LOB。
BCLOB:二进制LOB,用于存储大量的二进制信息。
BFILE:二进制文件LOB,一个指针。*/--Oracle 11g中引入了一种称为SecureFile的新LOB架构,在此之前的称为BasicFile。--创建SecureFile
EODA@PROD1> set echo on
EODA@PROD1>
EODA@PROD1> create table t2    ( id int primary key,3    txt clob4    )5  segment creation immediate6  /Table created.EODA@PROD1>
EODA@PROD1> column column_name form a12
EODA@PROD1> column securefile form a12
EODA@PROD1>
EODA@PROD1> select column_name, securefile from user_lobs where table_name='T';   --这个SQL验证创建的LOB是否是SecureFileCOLUMN_NAME  SECUREFILE
------------ ------------
TXT      NOEODA@PROD1> show parameter securefileNAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
db_securefile                string  PERMITTED/*
DB_SECUREFILE specifies whether or not to treat LOB files as SecureFiles.
PERMITTED LOBs are allowed to be created as SecureFiles.
并没有找到原因所以设置成FORCE,11g可能默认设置为BasicFile
*/EODA@PROD1> alter session set db_securefile=FORCE;  Session altered.EODA@PROD1> drop table t purge;Table dropped.EODA@PROD1> create table t2    ( id int primary key,3    txt clob4    )5  segment creation immediate6  /Table created.EODA@PROD1>
EODA@PROD1> column column_name form a12
EODA@PROD1> column securefile form a12
EODA@PROD1>
EODA@PROD1> select column_name, securefile from user_lobs where table_name='T';COLUMN_NAME  SECUREFILE
------------ ------------
TXT      YES                    --此处创建成功EODA@PROD1>
EODA@PROD1> set long 10000
EODA@PROD1> select dbms_metadata.get_ddl( 'TABLE', 'T' )  from dual;  --查看LOB设置的选项DBMS_METADATA.GET_DDL('TABLE','T')
--------------------------------------------------------------------------------CREATE TABLE "EODA"."T"(    "ID" NUMBER(*,0),"TXT" CLOB,PRIMARY KEY ("ID")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)TABLESPACE "USERS"  ENABLE) SEGMENT CREATION IMMEDIATEPCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255NOCOMPRESS LOGGINGSTORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)TABLESPACE "USERS"LOB ("TXT") STORE AS SECUREFILE (TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192NOCACHE LOGGING  NOCOMPRESS  KEEP_DUPLICATESSTORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))--创建BasicFile
EODA@PROD1> show parameter secureNAME                    TYPE    VALUE
------------------------------------ ----------- ------------------------------
db_securefile                string  PERMITTED
EODA@PROD1> create table t2    ( id int primary key,3    txt clob4    )5  segment creation immediate6  /Table created.EODA@PROD1>
EODA@PROD1> column column_name form a12
EODA@PROD1> column securefile form a12
EODA@PROD1>
EODA@PROD1> select column_name, securefile from user_lobs where table_name='T';COLUMN_NAME  SECUREFILE
------------ ------------
TXT      NOEODA@PROD1>
EODA@PROD1> set long 10000
EODA@PROD1> select dbms_metadata.get_ddl( 'TABLE', 'T' )  from dual;DBMS_METADATA.GET_DDL('TABLE','T')
--------------------------------------------------------------------------------CREATE TABLE "EODA"."T"(    "ID" NUMBER(*,0),"TXT" CLOB,PRIMARY KEY ("ID")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)TABLESPACE "USERS"  ENABLE) SEGMENT CREATION IMMEDIATEPCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255NOCOMPRESS LOGGINGSTORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)TABLESPACE "USERS"LOB ("TXT") STORE AS BASICFILE (TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTIONNOCACHE LOGGINGSTORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))--查看LOB对象的段,通常被称为多段对象
EODA@PROD1> select segment_name, segment_type from user_segments;SEGMENT_NAME              SEGMENT_TY
------------------------------ ----------
T                  TABLE
SYS_C0018115               INDEX           --支持主键约束
SYS_IL0000085725C00002$$       LOBINDEX    --LOBINDEX用于从LOB找出数据的某些片段
SYS_LOB0000085725C00002$$      LOBSEGMENT  --实际的lob数据就存储在LOBSEGMENT中--参数介绍
--1.TABLESPACE
LOB ("TXT") STORE AS BASICFILE ( TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192) RETENTION
这里的tablespace是用来存储LOBSEGMENT和LOBINDEX的表空间。
那么为什么要把LOB数据放到另一个表空间呢?因为LOB数据通常是一种规模很大的信息,如果表有百万行,每行有一个很大的LOB那么LOB就会非常庞大。此时考虑到备份恢复以及空间管理,将表与LOB分离就是一个明智的选择。--2.IN ROW子句
这控制了LOB数据是否总与表分开存储(LOBSEGMENT中)
如果设置了ENABLE STORAGE IN ROW,那么小LOB(最多4000字节)就会像VARCHAR2一样存储在表本身,超过则存放在LOBSEGMENT中。
如果设置了DISABLE STORAGE IN ROW则不会存储在表中。--实验查看两种设置的性能差别
EODA@PROD1> set echo on
EODA@PROD1>
EODA@PROD1> create table t2    ( id int   primary key,3      in_row   clob,4     out_row  clob5    )6    lob (in_row)   store as ( enable   storage in row )  --设置为enable7    lob (out_row) store as ( disable storage in row )  --设置为disable8  /Table created.EODA@PROD1>
EODA@PROD1> insert into t   --插入一些字符串数据,不超过4000字节的数据2    select rownum,3           owner || ' ' || object_name || ' ' || object_type || ' ' || status,4          owner || ' ' || object_name || ' ' || object_type || ' ' || status5      from all_objects6  /72931 rows created.EODA@PROD1>
EODA@PROD1> commit;Commit complete.EODA@PROD1>
EODA@PROD1> alter session set tracefile_identifier='tk';Session altered.EODA@PROD1> EXEC DBMS_MONITOR.session_trace_enable;PL/SQL procedure successfully completed.EODA@PROD1>
EODA@PROD1> declare        --分别逐行读取查看性能2           l_cnt    number;3           l_data   varchar2(32765);4  begin5          select count(*)6          into l_cnt7         from t;8  9           dbms_monitor.session_trace_enable;10            for i in 1 .. l_cnt11           loop12              select in_row  into l_data from t where id = i;  13                select out_row into l_data from t where id = i;14          end loop;15  end;16  /PL/SQL procedure successfully completed.EODA@PROD1>
EODA@PROD1> EXEC DBMS_MONITOR.session_trace_disable;PL/SQL procedure successfully completed.
SELECT IN_ROW
FROMT WHERE ID = :B1call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute  72931      0.67       0.91          0          0          0           0
Fetch    72931      0.73       1.03          0     218793          0       72931
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total   145863      1.40       1.95          0     218793          0       72931SELECT OUT_ROW
FROMT WHERE ID = :B1call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute  72931      0.56       0.78          0          0          0           0
Fetch    72931      9.50      13.67      72931     510520          0       72931
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total   145863     10.07      14.45      72931     510520          0       72931--明显IN_ROW速度快很多,而且占用的资源也远远小于OUT_ROW列--3.CHUNK子句
LOB数据存储在CHUNK中,LOB索引实际会指向CHUNK。CHUNK是逻辑上连续上连续的一组数据库块,是LOB最小分配单元。
**CHUNK自己只适用与BasicFile,虽然SecureFile也有同样语法不过仅用于向后兼容。
比如一个4MB的LOB实例,在使用8KB的CHUNK时,需要512个CHUNK来存储。--4.RETENTION子句
securefile lob中没有RETENTION子句因为是自动设置的,而basicfile lob需要手动设置。
RETENTION子句用于LOB数据的读一致性。/*
LOB实现读一致性的方式与普通数据不同,LOBSEGMENT并不使用UNDO段来记录其修改,而是直接在LOBSEGMENT本身中维护信息的不同版本。
LOBINDEX会像其他段一样生成UNDO,但是LOBSEGMENT并不会。
当我们修改一个LOB时,Oracle会分配一个新的CHUNK,修改的数据写入新的CHUNK,但是原来的CHUNK还会保留。
如果你回滚了事务,那么LOB索引上的修改会回滚,这样索引就会再次指向原来的CHUNK,所以LOBSEGMENT的UNDO维护是自身执行的。
*/那么问题来了,如果不用UNDO段来存储回滚LOB所需要的信息,那么怎么避免ORA-1555?
这就是RENTENTION/PCTVERSION子句所起到的作用!
/*BasicFile*/如果我们给LOB设置了RETENTION子句,那么被修改的数据在LOB段中的保留期限就会采用参数UNDO_RETENTION的设置。
/*SecureFile*/默认设置持久的RETENTION子句
如果我们给LOB设置了PCTVERSION子句,这可以控制版本的LOB信息能占用多少现有空间(就是LOBSEGMENT的高水位线)。
**修改PCTVERSION alter table tablename modify lob(lobname) (pctversion n);--5.CACHE子句
这个子句控制了LOBSEGMENT数据是否会存储在缓冲区缓存中,默认设置为NOCACHE。
如果你的LOB不大,那么默认的设置可能并不合适。
***对于LOB数据的缓存是使用传冲去KEEP池或RECYCLE池的一个绝佳机会,可以与其他常规数据个离开。

--参考来源《Oracle编程艺术深入理解 数据库 体系结构(第三版)》

LOB浅析(CLOB/BCLOB/NCLOB)相关推荐

  1. oracle对大对象类型操作:blob,clob,nclob,bfile

    在oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob.下面是对lob数据类型的简单介绍.blob:二进制lob,为二进制数据,最长可达4GB,存贮在数据 ...

  2. php oracle 大字段,php oracle数据库clob和nclob字段

    php oracle数据库clob和nclob字段 nclob类型 1.nclob不能使用php的stream_get_contents来获取数据库的资源内容, 2.并且nclob只能使用to_cha ...

  3. Struts+Spring+Hibernate处理Lob(Blob,Clob)--sessionFactory中注入 org.springframework.jdbc.support.lob.Def

    [转载]org.springframework.jdbc.support.lob. 转载▼ 标签: 转载 分类: spring 原文地址:org.springframework.jdbc.suppor ...

  4. oracle中的blob类型,clob类型,nclob类型主要区别是什么

    1.BLOB全称为二进制大型对象(Binary Large Object).它用于存储数据库中的大型二进制对象.可存储的最大大小为4G字节 2.CLOB CLOB全称为字符大型对象(Character ...

  5. oracle中lob类型学习

    oracle中支持4种类型的LOB(large object) CLOB:字符LOB.这种类型用于存储大量的文本信息,如xml或者只是纯文本.这个数据类型需要进行字符集转换,也就是说,在获取时,这个字 ...

  6. ORACLE数据库数据类型

    Oracle的数据类型 Oracle的数据类型分为标量(Scalar)类型.复合(Composite)类型.引用(Reference)类型和LOB(Large Object)类型4种类型. 因为标量类 ...

  7. 专为Oracle数据恢复而生 - PRM

    PRM是Oracle企业级灾难恢复工具,其具备Oracle DUL的数据恢复能力,又兼顾了软件的易用性. PRM For Oracle Database 3.1版本主界面: PRM可以恢复几乎所有操作 ...

  8. 专为Oracle数据恢复而生 - PRM/DUL

    PRM是Oracle企业级灾难恢复工具,其具备Oracle DUL的数据恢复能力,又兼顾了软件的易用性. PRM For Oracle Database 3.1版本主界面: PRM可以恢复几乎所有操作 ...

  9. sqoop-使用文档

    该项目已退役.详情请参阅其 阁楼页面. 文档主页 Sqoop 用户指南 (v1.4.7) Sqoop 用户指南 (v1.4.7) 目录 一.简介 2. 支持的版本 3. Sqoop 发布 4. 先决条 ...

  10. 使用NHibernate, Oracle Clob/NClob无法插入

    NHibernate配置的Driver为NHibernate.Driver.OracleClientDriver,存入Clob.NClob字段,值比较大时报错,错误信息 中文:ORA-01461: 仅 ...

最新文章

  1. Windows 10 开发日记(五)-- 当Binding遇到异步 -- 解决方案
  2. Socket网络协议之二
  3. 2021-02-06 Python通过matplotlib包和gif包生成gif动画
  4. 互联网人的《三十而已》:裸辞,催婚,职业瓶颈,逃离北上广深......
  5. 动态规划法(九)想要更多例子?
  6. 关于Crypto.PublicKey.RSA,在generate后无法被赋值问题
  7. 请求发送者与接收者解耦——命令模式
  8. Java Web开发技术详解~MIME类型
  9. 计算机属性桌面打不开怎么办,win10电脑桌面图标属性打不开如何解决_win10无法打开桌面图标属性面板解决步骤...
  10. 不得不会的10点Java基础知识
  11. RocketMQ 一行代码造成大量消息发送失败
  12. Redis系列(三)-Redis发布订阅及客户端编程
  13. matlab激活中遇到 matlab2017a license error -8,523错误
  14. 8uftp,什么是8uftp
  15. 51c语言单片机io口控制实验报告,单片机实验报告二 单片机IO口实验
  16. 渲染科研入门到入土(Chinagraph2020闫令琪老师分享)
  17. Cousera - Deep Learning - 课程笔记 - Week 6
  18. 优秀的网站加速插件 – WP rocket详细设置教程
  19. Java微信支付开发之查询订单
  20. Voxel RCNN:高性能3D目标检测网络(AAAI2021)

热门文章

  1. 删除当前用户IE临时文件win7版批处理
  2. C# StreamReader 读取ANSI编码文本文件乱码
  3. python 008 __ 小斌文档 | 元组
  4. Spring Cloud GateWay-过滤器
  5. MySQL(5)条件查询 | 单行函数 | 事务详解
  6. c语言分数乘法,武汉小学数学六年级
  7. 泛微OA流程中调用SAP接口
  8. 三阶魔方 kociemba算法解析(IDA*的绝佳实际运用)
  9. css下标怎么打,css如何显示文字的上标和下标
  10. FPGA零基础学习:VGA协议驱动设计