前言
LOB,或大对象,是Oracle处理和存储非字符数据的首选方式,如mp3、视频、图片等,以及长字符数据(非结构化和半结构化数据)。二进制大对象(blob)和字符大对象(clob)可以存储高达tb的数据。
文章后续测试:《Oracle LOB——空间重用规则》
LOB的种类
BasicFiles
Oracle已经引入了许多新的多媒体数据类型(LOB数据类型),使得处理图片、视频、音频或大型字符数据集变得更加容易。
在Oracle8之前的早期版本中,所有多媒体类型都被放置在LONG RAW数据类型中。
由于Oracle对LONG RAW的所有限制,通常更容易将大型对象类型数据保存在数据库外部,只使用Oracle作为文件位置的索引系统。
对于Oracle8i和更高版本的数据库,建议使用LOB数据类型存储大量结构化和半结构化数据。LOB数据类型比LONG和LONG RAW类型有几个优点,包括:
-
LOB容量:
lob可以存储更大量的数据。lob可以存储4GB或更多数据,具体取决于您的系统配置。LONG和LONG RAW类型的数据限制为2GB。
-
表中LOB列的个数:
一个表可以有多个LOB列。表中的LOB列可以是任何LOB类型。
在Oracle Release 7.3及更高版本中,表被限制为单个LONG或LONG RAW列。
-
随机分段访问:
lob支持对数据的随机访问,而long只支持顺序访问。
lob也可以是对象属性。
SecureFiles
从Oracle Database 11g Release 1开始,Oracle引入了SecureFiles,一种新的LOB存储架构。
SecureFiles lob是在CREATE TABLE语句中出现存储关键字SECUREFILE时创建的。
原始的LOB存储架构BasicFiles LOB是默认存储。如果没有使用关键字SECUREFILE,或者在CREATE TABLE语句中使用关键字BASICFILE,则创建为BasicFiles lob。
SecureFile只能创建在ASSM (automatic segment space management)表空间中。
LOB的优缺点
Oracle SecureFiles增加了以下功能:
-
智能LOB压缩允许用户显式地压缩数据以节省磁盘空间。此特性只能与此版本中的新LOB实现一起使用(存储参数SECUREFILE)。
-
智能LOB加密为LOB引入了一种新的加密工具。加密数据现在存储在原地,可用于随机读取和写入。此特性只能与此版本中的新LOB实现一起使用(存储参数SECUREFILE)。
-
通过重复数据删除,Oracle数据库可以自动发现重复的LOB数据,只存储一个副本(存储参数SECUREFILE)以节省空间。
-
LOB数据路径优化包括存储层以上的逻辑缓存、读取预取、新的缓存模式、矢量I/O等。
-
新的LOB api。现有的OCI函数作用于新的SECUREFILE lob。还添加了新的OCI函数和PL/SQL包。对于lob, CREATE TABLE、ALTER TABLE和SQL命令的参数是新的或更改的。高性能空间管理包括对LOB SQL语句的更改和DBMS_SPACE包的更改。
SecureFiles LOBs 12c Enhancements
-
Enable PDML Operations on SecureFiles
在这个版本中,已经消除了对SecureFiles lob的并行DML (PDML)支持的限制。该特性允许SecureFiles利用Oracle数据库PDML特性的性能和可扩展性优势。 -
Oracle Data Pump: Support SecureFiles LOB as Default
impdp命令行有一个新参数(PL/SQL DBMS_DATAPUMP包有一个新选项),它告诉Oracle Data Pump将所有lob创建为SecureFiles lob。默认情况下,从Oracle Database 12c Release 1(12.1)开始,所有LOB列都被创建为SecureFiles LOB。但是,Oracle Data Pump重新创建的表与导出数据库中存在的表完全相同,因此,如果一个LOB列是导出数据库中的BasicFile LOB, Oracle Data Pump将尝试将其重新创建为导入数据库中的BasicFile LOB。该特性允许用户强制将lob创建为SecureFiles lob,并迁移到最新的性能更好的特性。 -
SecureFiles is the Default for LOB Storage
在此版本中,当兼容初始化参数设置为12.1或更高时,SecureFiles现在是LOB存储的默认值。SecureFiles特性为在数据库中存储非结构化数据提供了最佳性能。将SecureFiles设置为非结构化数据的默认值有助于确保数据库在管理非结构化数据时提供最佳性能。 -
SQL Apply Support for SecureFiles LOBs
该特性为SecureFiles LOB列的重复数据删除提供了SQL Apply支持。SQL Apply可以用于使用SecureFiles lob的Oracle数据库的滚动升级,没有任何限制。
Restrictions on LOBs
- 不能是集群表的一部分。
- 不能用于SQL语句的以下部分:
- GROUP BY
- ORDER BY
- SELECT DISTINCT
- joins
- aggregate functions
- 不能使用ANALYZE命令进行分析。
- 不能包含在分区索引组织的表中。
- 不能在数组varray中使用它们。
- 不能使用nclob作为对象属性。
LOB的类型
内部lob
内部lob作为表中的列存储在数据库中,它们参与服务器的事务模型。内部lob有三种类型:
-
CLOB -字符LOB。用于存储数据库字符集中的字符数据
-
BLOB -二进制LOB。用于存储二进制、原始数据。
-
NCLOB -用于存储多字节字符数据(Unicode数据)的LOB
外部lob
外部lob作为操作系统文件存储在数据库外部。数据库中只存储对实际操作系统文件的引用。外部lob不参与事务。Oracle 8i/9i中唯一的外部LOB数据类型称为BFILE。
- BFILE -二进制文件的简称。BFILE LOB保存对存储在数据库外部的操作系统中的物理文件的大型二进制数据的引用。
内部lob和外部lob的区别
以下是一些比较重要的区别:
-
内部lob的类型包括CLOB、NCLOB和BLOB。唯一的外部LOB是BFILE。
-
内部lob作为表中的列存储在数据库中,而外部lob存储在数据库之外的操作系统文件中。
-
内部lob参与服务器的事务模型。在数据库发生故障时,可以恢复内部lob,并且可以提交甚至回滚对它们所做的更改。外部lob不参与事务。BFILE类型只允许对操作系统文件进行读访问。对外部lob的所有更改都必须通过底层操作系统在数据库外部完成。
-
内部lob使用复制语义。也就是说,当您使用表中另一行的LOB插入或更新LOB时,LOB定位器和LOB值将被复制到该行。另一方面,外部lob使用引用语义。那就是只复制BFILE位置,而不是实际的操作系统文件。
-
每个内部LOB列对每行都有一个不同的LOB定位器和一个不同的LOB值副本。每个BFILE列对每行都有自己的BFILE定位器。但是,您可以在表中有两行包含指向相同操作系统文件的BFILE定位器。
介绍LOB定位器
每个LOB都有一个LOB定位器。lob定位器是指向lob值实际位置的指针。与内部LOB相关联的定位器称为LOB定位器,而与外部LOB相关联的定位器称为BFILE定位器。在LOB列中存储数据时,同时也存储了LOB定位器。LOB定位器是在选择LOB列时返回给您的内容。然后可以使用这个定位器检索实际的LOB值。
LOB列可以初始化为NULL值,也可以设置为空。基本的区别与lob定位器有关。如果LOB列被设置为NULL,则LOB没有存储定位符或值。LOB的值将为NULL。然而,空LOB在列中存储有一个LOB定位器和一个长度为0的LOB值。在尝试使用各种编程接口(PL/SQL、OCI、Java等)开始向LOB列写入数据之前,需要使用LOB定位器填充它,使其变为 non-null。为此,对于clob和bclob使用内置函数EMPTY_CLOB(),对于blob使用EMPTY_BLOB()。对于BFILEs,使用BFILENAME()方法初始化BFILE列以指向OS文件。请记住,在查询LOB列时,只返回LOB定位器。各种编程接口使用这个lob定位器来操作lob值。
操作LOB最流行的方法之一可能是通过PL/SQL。PL/SQL提供了一种通过包DBMS_LOB操作lob的方法。DBMS_LOB包提供了过程和函数,允许操作特定的部分以及完整的内部lob以及对bfile的只读操作。使用和操作LOB的一个重要概念是,所有DBMS_LOB例程都基于LOB定位器工作。
LOB的参数
PCTVERSION:
指定用于维护LOB的旧版本占总体LOB存储空间的最大百分比。默认值为10,这意味着在使用了整个LOB存储空间的10%之前,不会覆盖旧版本的LOB数据。
Securefiles不能指定PCTVERSION参数,在11g兼容性下,创建Securefiles lob时忽略该参数。
RETENTION:
如果数据库处于自动undo模式,那么可以指定RETENTION而不是PCTVERSION来指示Oracle保留这个LOB的旧版本。此子句将覆盖PCTVERSION的任何先前设置。
注意:即使后续更改了UNDO_RETENTION, DBA_LOBS中的RETENTION仍将保持不变。但是,LOB undo应考虑到对参数UNDO_RETENTION随时间推移的影响更改。
RETENTION参数设计用于数据库的undo功能,例如闪回版本查询。当LOB列设置了RETENTION属性时,旧版本的LOB数据将在UNDO_RETENTION参数指定的时间内保留。
创建lob时不能同时指定PCTVERSION和RETENTION。
如果数据库运行在手动UNDO模式,则不能指定RETENTION。
参考文档
Primary Note: Overview of Oracle Large Objects (BasicFiles LOBs and SecureFiles LOBs) (Doc ID 1490228.1)
订阅号:DongDB手记
墨天轮:https://www.modb.pro/u/231198