在 Oracle中,为数据表字段column和PL/SQL语言,分别提供了多种数据类型,以应对实际开发中的多种类型。Lob类型是Oracle推出一种保存大对象的数据类型。当我们考虑将信息文件(十进制、二进制)、图像甚至音频信息采用数据库作为保存载体时,就需要使用lob

在Oracle中,为数据表字段column和PL/SQL语言,分别提供了多种数据类型,以应对实际开发中的多种类型。Lob类型是Oracle推出一种保存大对象的数据类型。当我们考虑将信息文件(十进制、二进制)、图像甚至音频信息采用数据库作为保存载体时,就需要使用lob类型数据。

目前Oracle支持的Lob类型具体包括四个子类型(subtype),分别为CLOB、BLOB、NLOB和BFILE。其中,CLOB、BLOB和NLOB都是将数据保存在数据库内部,而BFILE类型保存的核心是文件指针,真正的文件是保存在数据库外。

与传统的数据类型相比较,lob类型数据无论在管理上还是空间使用上,都有很多特殊之处。本篇主要介绍lob类型一些基本的存储特性。

1、环境准备和数据段segment特性

我们选择在Oracle 10gR2下进行试验。

SQL> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE 10.2.0.1.0 Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 – Production

使用create table命令,可以构建出一个实验数据表T。

SQL> create table t (id number,

cl clob);

Table created

对于一般的数据表而言,一个数据表只会对应一个存储数据段data segment对象。这里的特殊情况是分区表,通常一个分区就对应一个单独的存储对象。当数据表中包括lob类型的数据列时,也会有独特的段对象建立。

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME

------------------------------ ---------- ------------------------------

SYS_LOB0000056069C00002$$LOBSEGMENT USERS

TTABLE USERS

SYS_IL0000056069C00002$$LOBINDEX USERS

(篇幅原因,无关对象省略。。。。。。)

9 rows selected

我们发现,除了常规的数据段T之外,另外增加了两个明显是系统命名的段对象,类型分别为lobsegment和lobindex。

对Oracle lob类型数据表而言,一个带lob列的数据表创建是要对应多个数据段创建的。除了传统的数据表创建的数据段Table Data Segment之外,一个lob列都会生成两个专门的段:lob段和lob索引段。

Lob段(LobSegment)对应的是存放在数据表lob列上的数据。在Oracle的lob类型数据列,有两种保存位置结构。一个是in-row storage,也就是每一行的lob数据同其他列的数据以行的形式一起保存在数据块中。这种情况的lob列取值较小。而另一种为out-of-row storage,当lob对象较大,不能保存在一个数据块中时,可以将其放置在一个独立lobsegment中进行保存。而out-of-row

storage时数据行中lob列上保存的只是一个指向lobsegment对应位置的指针引用。

Lob索引段(LobIndex)是Oracle为每一个lob类型列强制生成的索引,主要作用是用于进行lob类型数据检索加速的操作。Lobindex与lob列共生,如果强制进行删除操作,是会报错的。

SQL> drop index SYS_IL0000056069C00002$$;

drop index SYS_IL0000056069C00002$$

ORA-22864: 无法 ALTER 或 DROP LOB 索引

2、lob类型数据表原始定义分析

使用dbms_metadata包,我们可以获取到数据表的全部定义,包括各种缺省参数和细节信息。

CREATE TABLE "SCOTT"."T"

( "ID" NUMBER,

"CL" CLOB

) 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 ("CL") 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)) ;

CREATE UNIQUE INDEX "SCOTT"."SYS_IL0000056069C00002$$" ON "SCOTT"."T" (

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"

PARALLEL (DEGREE 0 INSTANCES 0) ;

可以看到我们抽取出的元数据包括两个组成部分,数据表创建部分和lob索引创建部分。在数据表创建部分,我们可以看到将lob作为一个独立段对象进行存储设置和参数设置。

在lob索引创建部分,我们可以看到虽然是对应索引创建语句,但是从索引名称上显然是系统自动生成的对象名称

此外,还有很多是针对lob特殊的参数,如cache、enable storage in-row等,这些参数在数据表lob的行为和访问性能上有巨大的影响。由于篇幅和内容所限,我们在本篇中不加以累述。

3、lob段与lob索引存储转移

对于一个数据表涉及的多个段,很多时候我们需要将其进行移动处理。其中最常用的方法是使用move进行对象表空间的移动。

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME

------------------------------ ---------- ------------------------------

SYS_LOB0000056099C00002$$ LOBSEGMENT USERS

T TABLE

USERS

SYS_IL0000056099C00002$$ LOBINDEX USERS

9 rows selected

SQL> alter table t move tablespace system;

Table altered

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME

------------------------------ ---------- ------------------------------

T TABLE

SYSTEM

SYS_LOB0000056099C00002$$ LOBSEGMENT USERS

SYS_IL0000056099C00002$$ LOBINDEX USERS

9 rows selected

上面实验可以明确看到,当使用一般的move命令时,只会将数据表T段进行移动到新表空间。Lob段和对应的lobindex段没有变化。如果需要移动lob/lobindex,需要额外的单独操作。

SQL> alter index SYS_IL0000056069C00002$$ rebuild tablespace users;

alter index SYS_IL0000056069C00002$$ rebuild tablespace users

ORA-02327: 无法以数据类型 LOB 的表达式创建索引

Lobindex是不能使用rebuild直接重构的。

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME

------------------------------ ---------- ------------------------------

T_LOGSEGMENT LOBSEGMENTUSERS

SYS_IL0000056069C00002$$ LOBINDEX

USERS

T TABLE EXAMPLE

9 rows selected

SQL> alter table t move lob(cl) store as t_logsegment (tablespace

example);

Table altered

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME

------------------------------ ---------- ------------------------------

T TABLE EXAMPLE

SYS_IL0000056069C00002$$ LOBINDEX

EXAMPLE

T_LOGSEGMENT LOBSEGMENT

EXAMPLE

9 rows selected

使用alter table xxx move lob(xx) store as xxx (tablespace xxx);命令,我们可以进行lob列的存储位置调节。

在创建数据表的时候,同样可以使用lob(xxx)对应的数据表空间字句,执行存储lob对象的空间信息。

SQL> Create table DemoLob ( A number, B clob )

2 LOB(b)

3 STORE AS lobsegname (

4 TABLESPACE users

5 --STORAGE (lobsegment storage clause)

6 INDEX lobindexname (

7 TABLESPACE example

8 --STORAGE ( lobindex storage clause )

9 )

10 )

11 TABLESPACEsystem

12 --STORAGE( tables storage clause )

13 ;

Table created

SQL> select table_name, column_name, segment_name, tablespace_name, index_name from user_lobs;

TABLE_NAME COLUMN_NAM SEGMENT_NAME TABLESPACE_NAME INDEX_NAME

---------- ---------- ------------------------------ ------------------------------ ------------------------------

T CL T_LOGSEGMENT EXAMPLE SYS_IL0000056069C00002$$

在实际物理设计部署过程中,经常有将大对象分区和存储单独部署表空间的情况。可以根据实际的情况,将一些很大的lob列连同索引保存在单独的表空间上。

但是注意,一般数据表而言,lob段和lobindex段是在一个表空间上。即使在SQL语法上存在支持,但是将lob段和lobindex分开存储的语句通常被忽略掉。

SQL> alter table t move lob(cl) store as T_LOGSEGMENT (tablespace example index t_logindex (tablespace users));

Table altered

SQL> select table_name, column_name, segment_name, tablespace_name, index_name from user_lobs;

TABLE_NAME COLUMN_NAM SEGMENT_NAME TABLESPACE_NAME INDEX_NAME

---------- ---------- ------------------------------ ------------------------------ ------------------------------

T CL T_LOGSEGMENT EXAMPLE SYS_IL0000056069C00002$$

SQL> select segment_name, segment_type, tablespace_name from user_segments;

SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME

------------------------------ ---------- ------------------------------

T TABLE EXAMPLE

SYS_IL0000056069C00002$$ LOBINDEX EXAMPLE

T_LOGSEGMENT LOBSEGMENT EXAMPLE

9 rows selected

4、结论

Lob类型是一种我们经常使用的复杂数据类型。处理和管理lob类型的方法和我们常规的手段存在很大差异,无论是开发还是运维过程中都要特别注意。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

oracle lob类型和mysql text_OracleLob类型存储浅析相关推荐

  1. oracle lob类型和mysql text_LOB数据类型

    概述 由于无结构的数据往往都是大型的,存储量非常大,而LOB(large object)类型主要用来支持无结构的大型数据.用户可以用LOB数据类型来存储大型的无结构数据,特别是文本,图形,视频和音频等 ...

  2. linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  3. mysql二进制大文件_Mysql实例Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)...

    <Mysql实例Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)>要点: 本文介绍了Mysql实例Mysql LONGTEXT 类型存储大文件(二进制也可 ...

  4. mysql blob longblob_MYSQL教程Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理)

    <MYSQL教程Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理)>要点: 本文介绍了MYSQL教程Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理 ...

  5. 总结java数据类型和mysql、oracle、pgsql数据类型对应关系,附数据库字段类型转java类型代码

    java的基本数据类型有八种: byte.short.int.long.float.double.char.boolean 总结java和mysql.oracle.pgsql数据类型对应关系 java ...

  6. Oracle Clob类型和Blob类型之间的转换

    目录 一.背景 二.Clob 和 Blob 的区别 三.使用JDK的Base64编码 四.使用Oracle自带的Base64编码 一.背景 最近在迁移数据时,遇到了将Clob类型转换成Blob的问题, ...

  7. MySQL文本类型 存储大小,及各种数据类型在Java中用什么接收

    MySQL文本类型 基础类型: char (M个字节,0 <=M<= 255) varchar (L+1个字节,其中L<=M 且 0 <=M<= 65535) text ...

  8. oracle数据类型和Java类型之间的映射关系

    SQL数据类型 JDBC类型代码 标准的Java类型 Oracle扩展的Java类型   1.0标准的JDBC类型:     CHAR java.sql.Types.CHAR java.lang.St ...

  9. Java数据类型和MySql数据类型对应表

    java mysql 数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.String 12 CH ...

  10. mysql json类型存储list_list存储json字符串

    简介 ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎. 同时ES还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,能 ...

最新文章

  1. java 序列化慢_java原生序列化慢在哪里?
  2. python绘制立体扇形_Python实现PS滤镜特效之扇形变换效果示例
  3. Eclipse --Type /com.xx.app/gen already exists but is not a source folde解决方案
  4. 如何破解“中国开源拿来主义”?包云岗的几点分析
  5. STM32之独立看门狗原理
  6. New to My Oracle Support?
  7. 窗体控件绑定泛型数组 0104 c#
  8. 三、 复杂对象类型的WebService
  9. Winform界面中实现菜单列表的动态个性化配置管理
  10. 阅读笔记——基于CART决策树的计算机网络课程学生成绩分析
  11. 发送邮件被退回,提示: Helo command rejected: Invalid name 错误
  12. Java JDK8新特性Lambda表达式
  13. java--获取指定时间与现在时间的差值
  14. ECN Trade:最强飓风来袭,总统大选间断
  15. 开关Switch系列:Switch修改滑块(thumb)和滑道(track)的颜色(一)
  16. Redis过期策略---实现原理
  17. python中的range()函数详解
  18. J storm战队成员_DOTA2:林书豪队伍J.Storm阵容公布,“瑞士鲁迅”成功留队!
  19. 很抱歉,系统监测到你的支付宝账号有异常,入驻失败,如需帮助请拨打热线-------支付宝开放平台入驻失败如何解决???
  20. vue推算最近n天的日期,两种方法

热门文章

  1. Linux:Linux下进程间通信方式的学习
  2. Kotlin协成的简单理解
  3. 参照物中找趋势(大道至简之十七)
  4. 中国5级行政区域MySQL数据库库
  5. Redis HyperLogLog 是什么?这些场景使用它,让我枪出如龙,一笑破苍穹
  6. java程序设计六大原则
  7. 我希望进入大学时就能知道的一些事儿 -----作者:瞬息之间
  8. “十三五”公共安全规划涉及哪些安防概念?
  9. 了解如何在Windows中安全删除文件
  10. Android 点击键盘外 非输入框 关闭软键盘