`
cargoj
  • 浏览: 57920 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Oracle 数据类型及存储方式(四)LOB类型

阅读更多

第四部分 LOB类型
§ 4.1 LOB类型
4.1.1 LOB类型分类
CLOB:字符LOB.用于存储大量的文本信息.采用默认字符集存储
NCLOB:用于存储字符LOB,采用数据库的国家字符集来存储字符.而不是数据库的默认字符集.
BLOB:二进制LOB,存储二进大量的二进制信息.存储时不会进行字符集转换.
CLOB和BLOG在ORACLE 10G中可存储8TB字节.
BFILE:二进制文件LOB,只是一个文件指针.具体的文件存储在操作系统中.

4.1.2 LOB类型存储方式

我们把CLOB,NCLOB,BLOB存储在数据库的内部称为内部LOB.这些存储方式都相似,所以可以一起进行讨论.

SQL> create table test_lob (id int primary key,remark clob);

Table created

对于LOB列的创建有非常多的选项.可以查ORACLE文档.
最简单的就是使用dbms_metadata来获得它的完整的脚本.
select dbms_metadata.get_ddl('TABLE','TEST_LOB') from dual;

得到如下结果
CREATE TABLE "YUAN"."TEST_LOB"
   ( "ID" NUMBER(*,0),
"REMARK" CLOB,
PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE
   ) 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"
LOB ("REMARK") STORE AS (
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))

LOB列的定义可以有以下属性.
存储的表空间,本例为USER.也就是说可以为LOB单独指定表空间.
ENABLE STORAGE IN ROW 默认的一个属性
CHUNK 属性
PCTVERSION 属性
NOCACHE 属性.
一个完整的STORAGE语句.

可见,LOB类型之前介绍的数据类型相比要复杂得多了.
当我们创建了一个带的LOB列的表后,我们可以从USER_SEGMENTS查到,数据库增加了几个段对象.
SQL> select segment_name,segment_type from user_segments;

SEGMENT_NAME                      SEGMENT_TYPE
--------------------------------- ------------------
BIN$nZwCJWDmQM+ygfB1U8tcIw==$0    TABLE
BIN$0jfW0nNQR/2JEQmbAmfcRQ==$0    TABLE
TEST_TIMESTAMP                    TABLE
TEST_TIMESTAMP2                   TABLE
TEST_TIMESTAMPWZ                  TABLE
TEST_TIMELTZ                      TABLE
TEST_INTERVARYM                   TABLE
TEST_INTERVALYM2                  TABLE
TEST_INTERVALDS                   TABLE
TEST_LOB                          TABLE
SYS_LOB0000043762C00002$$         LOBSEGMENT
SYS_IL0000043762C00002$$          LOBINDEX
SYS_C004324                       INDEX

后面四个段空间对象.新增了四个物理段.普通表只会新增一个或两个段对象.类型为TABLE和INDEX.
而LOB列则额外新增了两个段对象,类型为LOBSEGMENT和LOBINDEX.
SYS_C004324是一个索引段,因为我们有一列为主键.
作为普通字段,数据就存放在表段中.索引就放在索引段中.
而对于LOB数据,数据并不是存在表段中,而是存放在LOBSEGMENT段中.(有些情况下是存放在表test_lob中的.后面会讲)
LOBINDEX用于指向LOB段,找出其中的某一部分.
所以存储在表中的LOB存储的是一个地址,或者说是一个指针,也可以说是一个LOB定位器(LOB locator).
存储在LOBindex中的应该是每一个LOB行的地址.数据是具体存储在LOBSEGMENT中的.
我们先从TEST_LOB的LOB列中找到一个地址,然后在LOBINDEX中来查找这些字节存储在哪里.然后再访问LOBSEGMENT.由此我们可以 把lobindex和lobsegment想成是一个主/细表的关系.


实际上lob列中存的是一个地址段.然后在lobindex找到所有的地址段.然后在lobSegment中把所有地址段的值都读取了来

4.1.3 LOB类型存储参数介绍
在此,我们已经基本了解了LOB是怎么存储的.我们也从脚本中看到了LOB类型的参数.现在我们就来了解这些参数
1. LOB表空间
LOB ("REMARK") STORE AS (
TABLESPACE "USERS"
在test_lob表中的create语句中包含上面的语句.这里指定的表空间指的是存储lobindex 和lobsegment的表空间.也就是说,存放lob数据与LOB列所在的表是可以在不同的表空间的.
数据表和LOB存放在不同的表空间.
为什么LOB数据会放在不同的表空间呢?这主要还是管理和性能的问题.
LOB数据类型代表了非常巨大的容量.在ORACLE 10G之前,LOB列可以存放4GB字节的数据.在ORACLE 10G 中LOB类型可以存放8TB字节的数据.这是非常庞大的数据.
所以就有必要为LOB数据使用一个单独的表空间,对于备份和恢复以及空间管理.你甚至可以让LOB数据使用另外一个区段大小,而不是普通表数据所用的区段 大小.
另外从I/O性能的角度考虑.LOB是不在缓冲区缓存中进行缓存.因此每个LOB的读写,都会产生物理I/O.正因为如此,如果我们很清楚在实际的用户访 问中,有些对象会比大部分其它对象需要花费更多的物理I/O,那么就需要把这些对象分离到其它的磁盘.
另外,lobindex 和lobsegment是在同一个表空间中的.不可以把lobindex和lobsegment放在不同的表空间中.在oracle 8i之前版本,允许将lobindex和lobsegment放在不同的表空间中.
2. IN ROW 语句
LOB ("REMARK") STORE AS (
TABLESPACE "USERS" ENABLE STORAGE IN ROW
我们已经了解了LOB类型的存储结构,但是这种结构会带来额外的磁盘访问.不管是读还是写都会比普通数据类型要慢及带来更多的物理I/O.
针对这种情况,ORALCE作出了个改进就是IN ROW 语句.
使用ENABLE STORAGE IN ROW从字面上理解就是允许行内存储.当LOB的内容小于4000字节时,就把数据存储在数据表中的,即LOB数据与数据表都是同一个表空间中.这里的 LOB就相当于VARCHAR2一样,这里LOB列的数据还可以进入缓冲区进行存储.当LOB内容超过了4000字节后,就会把数据移到 lobsegment中去.
当定义一个LOB列时,它的大小一般都是小于4000字节的,启用IN ROW 是非常重要的.
如果要禁用IN ROW ,就使用DISALBE STORAGE IN ROW
3. CHUNK 参数
LOB ("REMARK") STORE AS (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192

CHUNK 意为大块,块.是指LOB存储的单位.指向LOB数据的索引会指向各个数据块.CHUNK是逻辑上连续的一组数据块.CHUNK是指LOB的最小分配单 元.而数据库的最小内存分配单元是数据块(BLOCK).CHUNK大小必须是ORACLE块大小的整数倍.
我们先来了解一下LOB与CHUNK的关系.
1. 每一个LOB实例(即每一行的LOB值)会至少占用一个CHUNK.
用我们本节的数据表test_lob为例,remark列为LOB类型.
假设该表有1000行数据,每一行的remark列的值大小都为7KB.
这样数据库就会分配1000个CHUNK.如果CHUNK的大小设置是64KB,就会分配1000个64KB的CHUNK.如果CHUNK的大小为 8KB,就分配1000个8KB的CHUNK.
重要的一点就是一个CHUNK只能由一个LOB对象使用.这有一点像CHAR这种定长类型.如果把CHUNK设为64KB,而实际上我们每一个LOB对象 只有7KB的大小,每一列浪费57KB的空间.1000列就浪费了55M的空间.而把CHUNK设为8KB,1000列大约浪费1M的空间.
我们还知道lobindex,且于指向各个块.它会记录每个块的地址.所以当块越多时,索引就越大,索引越大时,读写就会更慢.整体的性能就会降低.
比如每个列的LOB字段实际值大约8M,使用8KB的CHUNK.那么就需要1024个CHUNK.那么在lobindex中就会有1024条记录,用来 指向这些CHUNK.
指定CHUNK值,影响到性能和空间.
如果CHUNK过大,就会白白浪费存储空间,如果CHUNK过小,就会降低性能.
所以我们需要在空间和性能上进行取舍和折中.

4. PCTVERSION 语句
LOB ("REMARK") STORE AS (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10
PCTVERSION用于控制LOB的读一致性.普通字段都会有UNDO记录的.而lobsegment是没有undo记录的.而是直接在 lobsegment本身中维护停息的版本.lobindex会像其它段一样生成undo记录.但是lobsegment不会.
修改一个LOB对象时,oracle会分配一个新的CHUNK,而来的CHUNK会被保留下来.如果事务正常的提交了,lobindex就像指向新的 CHUNK.如果事务被回滚了,lobindex就再指回原来的CHUNK.所以undo维护是在LOB段自身中实现的.
这样一来,就会有非常多的无用的CHUNK被开销了.这也是非常大的空间损耗.这些CHUNK指的是数据的旧版本信息.那如何来控制这些旧版本数据占用的 空间呢?这就是PCTVERSION的作用.也就是说用多少额外的空间来存储旧版本数据.我们可以看到默认的值是10%.如果你确实经常修改LOB,那么 就需要把它设为10%就不够了,需要增加这个值.

5. CACHE参数
LOB ("REMARK") STORE AS (
TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10
NOCACHE
除了NOCACHE外,这个选项还可是CACHE和CACHE READS.这个参数控制lobsegment数据是否存储在缓冲区的缓存中.默认为NOCACHE,也就是每次访问都是从磁盘直接读取写.
CACHE READS允许缓存从磁盘读的LOB数据.但是写入LOB数据是直接写进磁盘的.
CACHE则是允许读和写都能缓存LOB数据.

有些情况下,LOB字段只有几KB大小,进行缓存就非常有用了.如果不缓存,当用户更新LOB字段时,还必须进行等待,从磁盘直接读数据和写数据.
如果要修改缓存设置可以用下面的语句
ALTER TABLE test_lob modify LOB(remark) (CACHE);
ALTER TABLE test_lob modify LOB(remark) (NOCACHE);
ALTER TABLE test_lob modify LOB(remark) (CACHEREADS);
但是对于大数据量的LOB读写,比如超过了20M.是没有理由把它放进缓存的

§ 4.2 BFILE
BFILE类型只是操作系统上一个文件的指针.用于对存储在操作系统中的文件提供只读访问.
使用BFILE时,还可以使用一个DIRECTORY 对象.DIRECTORY 是将一个操作系统目录映射到数据库的一个串.以便于提供可移值性.
SQL> create table test_bfile(id int primary key, moviefile bfile);

Table created

SQL> create or replace directory movie_directory as 'D:/movie';

Directory created
SQL> insert into test_bfile values(1,bfilename('movie_directory','英雄.dat'));

1 row inserted

对BFILE的操作需要使用DBMS_LOB包来进行.提供了一系统方法和函数

分享到:
评论

相关推荐

    Oracle 数据类型

    7、LOB数据类型用于存储大型的,没有被结构化的数据,例如二进制文件,图片文件,LOB主要分为BLOB和CLOB,BLOB数据类型用于存储二进制对象:图像,音频,视频...CLOB数据类型用于存储字符格式的大型对象 8、ORACLE...

    ORACLE中的数据类型.doc

    ORACLE中的数据类型.doc 当你在数据库中创建数据表的时候,你需要定义表中所有字段的类型。ORACLE有许多种数据类型以满足你的需要。数据类型大约分为:character, number, date, LOB, 和RAW等类型。虽然ORACLE8i也...

    ORACLE 存储过程返回结果集,拼接为字符串输出为clob

    大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,...

    Oracle 10g应用指导

    包括加密Oracle子程序,存储应用程序用户名和口令,禁止修改删除数据库对象,Oracle数据加密以及丢失SYSMAN及资料档案库用户口令的解决方法。书中给出了丰富的图表,多数图例是作者根据多年实践总结出来的,图示简练...

    批量导出ORACLE数据库BLOB字段生成图片

    只需要安装oracle client在本地,然后配置好tns,输入连接名,用户名,密码,数据表的名称,文件名数据列名以及blob数据列名,就可以批量导出ORACLE数据库BLOB字段生成图片

    北大青鸟Oracle教程集1

    Oracle主要 Oracle主要 数据类型 4-1 Character 数据类型 Number 数据类型 Date 数据类型 Raw 和 Long Raw 数据类型 LOB 数据类型 Oracle 主要数据类型 4-2 Character 数据类型 ― Char ― Varchar2 ― Long Number ...

    北大青鸟Oracle教程集2

    Oracle主要 Oracle主要 数据类型 4-1 Character 数据类型 Number 数据类型 Date 数据类型 Raw 和 Long Raw 数据类型 LOB 数据类型 Oracle 主要数据类型 4-2 Character 数据类型 ― Char ― Varchar2 ― Long Number ...

    Oracle数据库恢复工具Oracle Database Unloader(ODU)3.09

    支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 导出的数据格式包括纯文本和DMP文件两种。以纯...

    Oracle的CLOB大数据字段类型操作方法

    一、Oracle中的varchar2类型 我们在Oracle数据库存储的字符数据...当 VARCHAR2 容纳不下我们需要存储的信息时,就出来的Oracle的大数据类型LOB( Large Object,大型对象)。 二、Oarcle中的LOB类型 在Oracle中,LOB(Lar

    oracle数据库修复

    支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 全面支持LOB字段: 支持CLOB、NCLOB和BLOB CLOB...

    Oracle8i_9i数据库基础

    §1.7 ORACLE数据类型 38 §1.8 SQL 语句基础 44 §1.8.1 SQL语句所用符号 44 §1.8.2 简单select 查询 45 §1.9 伪列及伪表 46 §1.10 使用SQL Worksheet工作 46 第二章 查询基础 50 §2.1 SELECT语句 50 §2.2 SQL...

    oracle知识简介

    LOB数据类型存储非结构化数据,比如二进制文件,图形文件或其他外部文件。LOB可以存储到4GB。数据可以存储在数据库中也可以存储到外部数据文件中 BLOB 二进制大对象,可以是图像,音频文件以及视频文件 CLOB 存储...

    赤兔Oracle数据库恢复软件 v11.6.zip

    5.支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i ) , BINARY FLOAT, BINARY DOUBLE (10g ) 6.全面支持LOB字段:支持CLOB、NCLOB和BLOBCLOB...

    Oracle+10g应用指导与案例精讲

    包括加密Oracle子程序,存储应用程序用户名和口令,禁止修改删除数据库对象,Oracle数据加密以及丢失SYSMAN及资料档案库用户口令的解决方法。书中给出了丰富的图表,多数图例是作者根据多年实践总结出来的,图示简练...

    ORACLE9i_优化设计与系统调整

    §10.4 将LOB类型的字段与其它的类型分开 115 §10.5 采用具有编码的设计方法 115 §10.6 建立公共字典表 115 §10.7 哪种类型的表设为cache 方式 116 §10.8 数据表和索引分开原则 116 §10.9 是否采用簇和分区 116...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    LOB数据类型 clob 1~4GB 只能存储字符数据 nclob 1~4GB 保存本地语言字符集数据 blob 1~4GB 以二进制信息保存数据 三、 DDL语言 1. Create table命令 用于创建表。在创建表时,经常会创建该表的主键、外键、唯一...

    数据库基础 ORACLE

    §1.7 ORACLE数据类型 38 §1.8 SQL 语句基础 44 §1.8.1 SQL语句所用符号 45 §1.8.2 简单select 查询 46 §1.9 伪列及伪表 46 §1.10 使用SQL Worksheet工作 47 第二章 查询基础 51 §2.1 SELECT语句 51 §2.2 SQL...

    PRM-DUL Oracle(数据库恢复工具) v4.1.zip

    PRM-DUL Oracle数据库恢复工具,一款专为Oracle数据救援而研发的企业级工具。可在多个操作平台(AIX/HPUX/SOLARIS/Linux/Windows)使用并支持对Oracle 9i/10g/11g/12c各版本数据库的数据救援工作。软件基于JAVA 开发...

    Oracle数据库课件

    Oracle数据库 课件 包括:Oracle数据库的安装和卸载、安全管理、体系结构、sqlplus、数据字典及查询、数据类型、对象的创建与使用、PL SQL、游标及其使用、异常处理、存储过程、包、触发器、LOB数据类型、监听器和...

Global site tag (gtag.js) - Google Analytics