oracle lob 简单介绍

何为LOB?

lob为oracle数据库的一个大对象数据类型,可以存储超过4000bytes的字符串,二进制数据,OS文件等大对象信息.最大可存储的容量根oracle的版本和oracle 块大小有关.

有那几种可供选择的LOB类型?

目前ORACLE提供了CLOB,NCLOB,BLOB,BFILE共四种LOB类型,CLOB,NLOB为大字符串类型,NLOB为多语言集字符类型,类似于NVARCHAR类型,用他们代替以前的LONG类型;BLOG为大二进制类型,用来代替以前的LONG RAW类型;BFILE可存储操作系统中的各种文件.

何为Internal LOBs 、External LOBs?

Internal LOBs指的是LOB数据存储在oracle的tablespace中,CLOB,NCLOB,BLOG都是Internal LOBs; 而External LOBs指的是LOB数据存储在数据库外部的操作系统文件中,BFIEL是唯一的External LOBs.BFILE提供了让我们可以在SQL中访问外部文件的方法.

LOB到底能存多大的数据呢?

BFILE :Maximum size: 4 GB  Maximum size of a file name: 255 characters  Maximum size of a directory name: 30
          characters Maximum number of open BFILEs: The maximum number of BFILEs is limited by the value of the
          SESSION_MAX_OPEN_FILES initialization parameter, which is itself limited by the maximum number of open 
          files the operating system will allow.
BLOB: Maximum size: (4 GB - 1) * DB_BLOCK_SIZE initialization parameter (8 TB to 128 TB)  The number of LOB columns
         per table is limited only by the maximum number of columns per table (that is,10001).
CLOB: Maximum size: (4 GB - 1) * DB_BLOCK_SIZE initialization parameter (8 TB to 128 TB) The number of LOB columns
         per table is limited onlyby the maximum number of columns per table (that is,10001).
NCLOB :Maximum size: (4 GB - 1) * DB_BLOCK_SIZE initialization parameter (8 TB to 128 TB) The number of LOB columns
  per table is limited only by the maximum number of columns per table (that is,10001).

LOB可以用在什么地方?

LOB除了可以用在TABLE中定义列的类型外,还可以用来存储XML数据,ORACLE的集合类型,看下面的例子:

1) create table lobtest(a varchar2(20), b clob, c blob) tablespace users; –lob表的定义

2) LOB存储集合类型

create tablespace person_lob datafile size 102464K autoextend on next 100M maxsize 1024000K extent management local uniform size 1M segment space management auto;
/
alter user mayp quota unlimited on person_lob;

create or replace type person_att is object(id number(5),name varchar2(30),sex varchar2(1),age number(5,2));
/
create or replace type person_atts is varray(5) of person_att;
/
create table person(person_id number(5),attribute1 person_atts)
varray attribute1 store as lob person_attribute(
tablespace person_lob
enable storage in row
chunk 16384
pctversion 5
cache reads
index person_lob_idx)
tablespace users
pctfree 0
/
上面定义了一个用lob存储varray类型数据的例子.

LOB段有哪些属性?

默认情况下,当定义了含有LOB字段的table后, oracle会自动为每个LOB创建两个段,lob segment和lob index segment. lob segment存储了每个lob的具体的值,而lob index segment则存储了每个lob值的地址.lob segment、lob index segment和table segment存储在同一个表空间中.oracle为lob段提供了单独的段属性.我们在创建table时可以定义将lob和table分别存储在不同的表空间中。平常定义lob时,我们必须考虑以下几个比较重要的属性:

chunk:比oracle block size更大的一种逻辑块,专用于LOB数据的存储,默认为db_block_size的大小,如果手动定义必须定义为db_block_size的倍数.最大不能超过32K。不合理的chunk定义不及浪费存储空间,而且还会影响性能.那么在定义前必须了解应用, 每个LOB列的数据的平均大小,尽量减少LOB的空间浪费.看下面的表格能说明一切:

  Data Size                     CHUNK Size    Disk Space Used to Store the LOB  Space Utilization(Percent)
  3500 enable storage in row    irrelevant    3500 in row                        100  3500 disable storage in row   32 KB         32 KB                              10
  3500 disable storage in row   4 KB          4 KB                               90  33 KB                         32 KB         64 KB                              51
  2 GB +10                      32 KB         2 GB + 32 KB                       99+

上面表格用一些数据说明了chunk跟数据之间的存储关系,更形象的说明了磁盘空间的利率问题。 红色标记的部分说明了不合理的chunk定义.必须注意到的LOB中比chunk浪费的空间是不可以重用的.

disable/enable storage in row: 默认情况下为enable storage in row, 在没有分离lob段的情况下,table中的每行数据都存储在同一个block中,这样如果lob列很大时,可能会造成严重的行链接;当lob段和table段分离的情况下,oracle会自动将小于4k的lob数据存储在table segment,将大于4k的lob数据存储在lob段.如果设置为 disable storage in row的情况时,在lob段和table段分离的情况下, 不管lob数据多大,oracle都会将lob数据存储在lob段,这样就出现了上面的
3500 disable storage in row 32 KB ,32 KB ,10情况,浪费了90%的存储空间.

pctversion n /retention:这两个属性用来解决lob段的一致性读问题。lob的特殊性决定它不能使用undo/rollback segment来管理自己的更新的old version,通常lob会在自己所在的表空间中划分一部分空间来管理自己的undo,保证read consistent.lob中更新原理是在lob segment中分配新的chunk插入新的数据,保留旧的镜像,如果一个数据有多个更新存在的话, 那么就会存在多个版本.pctversion用来定义lob segment中undo区域的大小,pctverision 是一个百分比,定义所有lob空间用来存放前镜像的百分比,如果前镜像使用空间超过这个百分比了,oracle不自动扩展这部分的大小, 会重用这些前镜像的空间.如果一个lob segment段的更新很频繁的情况下,那么该lob段的增长可能会很快.retention是9i的新参数, 只能用在tablespace采用ASSM的情况,在lob更新的时候,前镜像会保留一段时间, 具体的时间由undo_retention参数决定.决定采用乃种undo 方式,必须对应用测试后在决定.

nocache/cache reads/cache:定义LOB的cache 方式,nocache为不cache任何 lob数据;cache reads为在lob read的情况下cache数据;cache为读写都cache数据.

lob创建的例子:
create table person_new(id number(5),name varchar2(30),remark clob,photo blob not null)
lob (remark) store as person_remark(
tablespace person_lob
enable storage in row
chunk 8192
pctversion 2
cache reads
index person_remark_idx)
lob (photo) store as person_photo(
tablespace person_lob
disable storage in row
chunk 16384
pctversion 2
cache reads
index person_photo_idx)
tablespace users
pctfree 10
/

LOB可以在SQL环境操作吗?

LOB可以像使用其他数据类型一样,可以进行DML操作.

insert into person_new values(1,’robin.ma’,‘he is a goold boy’,empty_blob());

update person_new set remark=’he is a goog boy,he is from Beijing China’ where id = 1;

delete from person_new where id = 1;

commit;

create table bfile_test(files bfile) tablespace users;

insert into bfile_test values(bfilename(’EXPORT’,‘c.dat’));

commit;

SQL> select * from bfile_test;
SP2-0678: Column or attribute type can not be displayed by SQL*Plus
SQL> select * from person_new;
SP2-0678: Column or attribute type can not be displayed by SQL*Plus

SQL> select remark from person_new;

REMARK
——————————————————————————–
he is a goog boy,he is from Beijing China

从上面的例子可以查看,BLOG和BFIEL 是不能直接在sql*plus显示的.

可以操作LOB的API有哪些?

PL/SQL可以用DBMS_LOB操作任何的LOB,BFILE对象,Oracle还提供了OCI编程接口操作LOB。Java,C#都提供了相应的API操作LOB。

怎样将其他字符类型转换成CLOB,二进制类型转换成BLOB?

通过TO_CLOB可以将CHAR,NCHAR,VARCHAR2,NVARCHAR2,NCLOB类型转换成CLOB;
通过TO_LOB可以将LONG RAW转换成BLOB,LONG转换成CLOB;
通过TO_NCLOB可以将CHAR,NCHAR,VARCHAR2,NVARCHAR2,CLOB转换成NCLOB。

LOB对象可以db link远程操作吗?

除了BFILE,CLOB,BLOB可以局部的访问和操作远程LOB对象.目前下列操作是允许的:

CREATE TABLE AS SELECT …FROM [email protected];
INSERT INTO .. SELECT * FORM [email protected];
UPDATE …SET .. = (SELECT ..FROM [email protected]);
INSERT INTO [email protected](…) AS SELECT * FROM LOCAL_TABLE;
UPDATE [email protected] SET .. = (SELECT .. FROM local_table);
DELETE FROM [email protected] WHERE …..

LOB相关的SQL function和DBMS_LOB不允许访问和操作远程的LOB对象。

LOB列可以索引吗?

目前CLOB列支持Oracle Text Index,Domain Index,Function-Base Index,Extensible Index.

LOB支持分区表吗?

可以在分区表使用LOB列,并且还支持exchange partition,move partition,merge partition等操作.

LOB支持Index-organization table吗?

oracle支持在index-organization table中创建clob,blog和bfile列, 但不支持在分区的index-organization table中创建lob列.

参考:Oracle Database Application Developer’s Guide - Large Objects 10g Release 2 (10.2)

时间: 2024-10-10 02:14:31

oracle lob 简单介绍的相关文章

Oracle 视图简单介绍

Oracle视图的种类 关系视图 关系视图:Oracle视图是作为数据库对象存在的,因此,创建之后也可以通过工具或数据字典来查看视图的相关信息.这是大家常用的视图 如:create view 视图名称 as 查询语句|关系运算 http://blog.csdn.net/tianlesoftware/article/details/5530618 内嵌视图 内嵌视图:在from语句中的可以把表改成一个子查询,如:select a.id ,b.id from emp a,(select id fro

Oracle JET简单入门(一)Oracle JET介绍

Oracle JET (Oracle Javascript Extension Toolkit)是一款 Oracle 的 JavaScript 拓展工具包.简单来说 Oracle JET 是一个一堆好用的前端工具结合体. Oracle JET 文档链接  http://docs.oracle.com/middleware/jet310/jet/developer/toc.htm Oracle JET支持 Model-View-ViewModel(MVVM)架构设计模式. 在 MVVM 中,Mod

重新发现Oracle太美之awr相关脚本简单介绍

大家知道在$ORACLE_HOME/rdbms/admin下,有如下的相关脚本(我的环境为11.2.0.4.2): [[email protected] ~]$ cd $ORACLE_HOME/rdbms/admin [[email protected] admin]$ ls -ltr awr* -rw-r--r-- 1 oracle oinstall  1999 Oct 24  2003 awrrpt.sql -rw-r--r-- 1 oracle oinstall 49166 Sep  1

[转]Oracle数据库ASH和AWR的简单介绍

在Oracle数据库中,有时我们可能会遇到这样的术语:ASH和AWR,那么它们是怎样产生的呢?它们的作用又是什么呢?本文我们就来介绍这一部分内容.       1.10g之前 用户的连接将产生会话,当前会话记录保存在v$session中:处于等待状态的会话会被复制一份放在v$session_wait中.当该连接断开后,其原来的连接信息在v$session和v$session_wait中就会被删除.这是10g之前的状况.       2.v$session_wait_history与ASH 若是一

Oracle高级队列介绍

原始链接:http://www.oracle-developer.net/display.php?id=411 oracle高级队列介绍 高级队列Advanced Queuing(AQ)在oracle多个版本都可得到.他是oracle原生消息软件并且在每一个版本都在加强. 这篇文章提供了一个AQ的高级概览.尤其是我们将看到如何启动一个队列并进行入列--出列操作,还有通过通知创建异步出列. 注意AQ支持数据库意外的消息监听(例如JMS消息队列).本文仅涉及数据库内部消息通信. 要求: 本例要求指定

SQLite数据库和JPA简单介绍

SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLitehttp://www.sqlite.org/download.htmlsqlite-dll-win32-x86-201410071659.zip(294.11 KiB)sqlite-shell-win32-x86-3080600.zip解压在文件夹D:\Database\sqlite下,得到文件s

plsql的环境与介绍:环境的搭建和plsql的简单介绍

PLSQL编程 1.环境的搭建 (1)创建一个存储表空间 SQL> conn /as sysdbaConnected. SQL> create tablespace plsql datafile '/u01/oracle/oradata/ORCL/plsql01.dbf' size 1G; Tablespace created. (2)创建PLSQL用户SQL> create user plsql identified by plsql default tablespace plsql;

iOS开发数据库篇—SQLite简单介绍

转自:http://www.cnblogs.com/wendingding/p/3868893.html 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1)归档:NSCodeing.NSKeyedArchiver (2)偏好设置:NSUserDefaults (3)Plist存储:writeToFile 提示:上述三种方法都有一个致命的缺点,那就是都无法存储大批量的数据,有性能的问题.

Maven仓库—Nexus环境搭建及简单介绍

1.    环境搭建 1.1  下载 http://www.sonatype.org/nexus/ NEXUS OSS [OSS = Open Source Software,开源软件--免费] NEXUS PROFESSIONAL -FREE TRIAL [专业版本--收费]. 所以选择NEXUS OSS 找到Download andInstall Nexus OSS.下载ZIP的即可: 1.2  配置 将下载的ZIP包解压,得到如下目录: 将Nexus的bin目录添加到Path环境变量中: