快捷搜索:  汽车  科技

oracle 怎么修改nclob类型数据(Oracle数据库lob大对象数据类型字段总结)

oracle 怎么修改nclob类型数据(Oracle数据库lob大对象数据类型字段总结)LOB除了可以用在TABLE中定义列的类型外 还可以用来存储XML数据 ORACLE的集合类型 看下面的例子:BFILE(存储指向OS文件的指针)用于存储电影文件。CLOB(存放大字符数据)用于存储大批量字符数据BLOB(存放大二进制数据)用于存放音频、图像、图像NCLOB(存放大字符数据)用于存储大批量字符数据

概述

今天主要对Oracle数据库lob大对象数据类型字段的详细讲解,介绍ORACLE提供的CLOB,NCLOB,BLOB,BFILE共四种LOB类型。


LOB概念

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


LOB分类

分为内部LOB和外部LOB。内部LOB包括CLOB、BLOB、NCOLB;外部LOB包括BFILE

内部LOB的数据存储在数据库中,并且支持事务操作(提交、回退、保持点);外部LOB的数据存储在OS文件中,并且不支持事务操作

CLOB(存放大字符数据)用于存储大批量字符数据

BLOB(存放大二进制数据)用于存放音频、图像、图像

NCLOB(存放大字符数据)用于存储大批量字符数据

BFILE(存储指向OS文件的指针)用于存储电影文件。


LOB应用场景

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

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

2) LOB存储集合类型

oracle 怎么修改nclob类型数据(Oracle数据库lob大对象数据类型字段总结)(1)

上面定义了一个用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的空间浪费。

oracle 怎么修改nclob类型数据(Oracle数据库lob大对象数据类型字段总结)(2)

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可以在SQL环境操作吗?

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

oracle 怎么修改nclob类型数据(Oracle数据库lob大对象数据类型字段总结)(3)

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


可操作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 table@remote;
  • INSERT INTO .. SELECT * FORM table@remote;
  • UPDATE …SET .. = (SELECT ..FROM table@remote);
  • INSERT INTO TABLE@REMOTE(…) AS SELECT * FROM LOCAL_TABLE;
  • UPDATE remote@table SET .. = (SELECT .. FROM local_table);
  • DELETE FROM remote@table 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列.


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

oracle 怎么修改nclob类型数据(Oracle数据库lob大对象数据类型字段总结)(4)

猜您喜欢: