本文转自:https://blogs.oracle.com/askmaclean/entry/oracle_database_12c%E6%96%B0%E7%89%B9%E6%80%A7_32k_varchar2

在Oracle Database 12c中,我们可以为varchar2、nvarchar2和RAW数据类型指定32767 bytes 的最大长度了, 以便用户将更长的字符串存储在数据库中。

在12c之前的版本中,varchar2和nvarchar2数据类型的最大长度是4000 bytes,而raw是2000 bytes。

varcha2、nvarchar2和raw字段的定义长度将影响字段的内部存储方式

  • 定义为4000字节或更小的varchar2、nvarchar2以及2000字节或更小的raw字段,将被inline存放
  • 定义为4000字节以上的varchar2、nvarchar2以及2000字节以上的raw字段的话,被称作extended character data type columns,以out of line方式存储。

参数MAX_STRING_SIZE控制扩展数据类型extended data type的最大长度:

  • STANDARD 代表12c之前的长度限制,即varchar2、nvarchar2 4000 bytes, raw 是2000  bytes
  • EXTENDED 代表12c 32k strings新特性,varchar2、nvarchar2、raw最大长度32k  bytes

Extended character data types 扩展字符类型存在以下的限制:

  • 不支持cluster table 簇表和index-organized tables索引组织表
  • 不支持intrapartition的并行DDL、UPDATE和DELETE DML
  • 不支持在Automatic Segment Space Management (ASSM)表空间上的intrapartition parallel direct-path inserts

为数据库配置扩展数据类型 的步骤如下:

  1. 关闭数据库实例  shutodnw immediate,如果是RAC则需要关闭所有实例
  2. 以upgrade模式启动数据库 实例 startup upgrade;
  3. 修改参数MAX_STRING_SIZE 为EXTENDED   ALTER SYSTEM SET MAX_STRING_SIZE = EXTENDED;
  4. 运行 @?/rdbms/admin/utl32k
  5. 重启数据库实例
 @?/rdbms/admin/utl32k

...Database user "SYS", database schema "APEX_040200", user# "98" 13:29:59
...Compiled 0 out of 2998 objects considered, 0 failed compilation 13:30:00
...263 packages
...255 package bodies
...453 tables
...11 functions
...16 procedures
...3 sequences
...458 triggers
...1322 indexes
...207 views
...0 libraries
...6 types
...0 type bodies
...0 operators
...0 index types
...Begin key object existence check 13:30:00
...Completed key object existence check 13:30:00
...Setting DBMS Registry 13:30:00
...Setting DBMS Registry Complete 13:30:00
...Exiting validate 13:30:00

必须要将MAX_STRING_SIZE 设置为EXTENDED 否则无法使用extended character data type columns 。

之后我们可以创建具体有extended character data type columns 的表了。

当然我们也可以将已有的VARCHAR2, NVARCHAR2, 和RAW字段修改其长度, 具体使用ALTER TABLE MODIFY (COLUMN 命令。在此场景中Oracle将实施块中的长度扩展,而不将inline的存储迁移为以外部LOB存储。

实际上Oracle并不建议你广泛积极地将现有的varchar2的长度增加为4000 bytes以上,基于以下的原因:

  • 很容易造成链式行row chaining
  • inline存储的数据行将被读取,不管该字段是否被select 。 实际inline的扩展字符类型显然会一定程度上影响性能。
  • 为了迁移到新的out-of-line的存储扩展字符类型方式,用户需要重建表。否则任何类型的表重新组织方式例如alter table move都将无法打破inline存储

用户可以将32k的字段加入到现有的堆表,具体使用ALTER TABLE ADD 的DDL语句。

Data Pump导入导出以及SQL*Loader均支持extended character data type columns。

现有字段上的索引无法实现数据类型扩展,所以必须先将字段上的索引drop掉,再修改为扩展长度,之后再重建索引。

关于32k varchar2 max_string_size 、extended character data type columns的一些演示:

SQL> set linesize 200 pagesize 20000
SQL> select banner from v$version where rownum=1; BANNER
-----------------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production SQL> show parameter MAX_STRING_SIZE NAME TYPE VALUE
------------------------------------ ---------------------- -----------------------------
max_string_size string EXTENDED SQL> CREATE TABLE long_varchar(id NUMBER,vc VARCHAR2(32767)); 表已创建。 SQL> DESC long_varchar
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER
VC VARCHAR2(32767) SQL> insert into long_varchar values(1,rpad('MACLEAN',30000,'A')); 已创建 1 行。 SQL> commit; 提交完成。 SQL> alter system flush buffer_cache; 系统已更改。 SQL> select dbms_rowid.rowid_block_number(rowid),dbms_rowid.rowid_relative_fno(rowid) from long_varchar; DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)
------------------------------------ ------------------------------------
97217 1 SQL> alter system dump datafile 1 block 97217; 系统已更改。 SQL> oradebug setmypid
已处理的语句
SQL> oradebug tracefile_name
C:\APP\XIANGBLI\diag\rdbms\maclean\maclean\trace\maclean_ora_5688.trc tab 0, row 0, @0x1f65
tl: 59 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [52]
00 54 00 01 01 0c 00 00 00 01 00 00 00 01 00 00 00 1f 50 05 00 20 05 00 00
00 00 03 15 e4 00 00 00 00 00 02 00 41 c5 73 00 41 c5 74 00 41 c5 75 00 41
c5 76
LOB
Locator:
Length: 84(52)
Version: 1
Byte Length: 1
LobID: 00.00.00.01.00.00.00.1f.50.05
Flags[ 0x01 0x0c 0x00 0x00 ]:
Type: BLOB
Storage: BasicFile
Enable Storage in Row
Characterset Format: IMPLICIT
Partitioned Table: No
Options: ReadWrite
Inode:
Size: 32
Flag: 0x05 [ Valid InodeInRow(ESIR) ]
Future: 0x00 (should be '0x00')
Blocks: 3
Bytes: 5604
Version: 00000.0000000002
DBA Array[4]:
0x0041c573 0x0041c574 0x0041c575 0x0041c576
end_of_block_dump 可以看到原生的32k varchar实际以BasicFile BLOB的方式out-of-line存储 SQL> create table convert_long(t1 int,t2 varchar2(20)); 表已创建。 SQL> insert into convert_long values(1,'MACLEAN'); 已创建 1 行。 SQL> commit; 提交完成。 SQL> create index ind_cl on convert_long(t2); 索引已创建。 SQL> alter table convert_long modify t2 varchar2(32767);
alter table convert_long modify t2 varchar2(32767)
*
第 1 行出现错误:
ORA-01404: ALTER COLUMN 将使索引过大 SQL> drop index ind_cl; 索引已删除。 SQL> alter table convert_long modify t2 varchar2(32767); 表已更改。 SQL> update convert_long set t2=rpad('MACLEAN',30000,'A'); 已更新 1 行。 SQL> commit; 提交完成。 SQL> alter system flush buffer_cache; 系统已更改。 SQL> select dbms_rowid.rowid_block_number(rowid),dbms_rowid.rowid_relative_fno(rowid) from convert_long; DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)
------------------------------------ ------------------------------------
117121 1 SQL> oradebug setmypid
已处理的语句
SQL> oradebug tracefile_name
C:\APP\XIANGBLI\diag\rdbms\maclean\maclean\trace\maclean_ora_4340.trc 可以看到形成了链式行 chained row tab 0, row 0, @0x7aa
tl: 6120 fb: --H-F--N lb: 0x2 cc: 2
nrid: 0x0041c984.0
col 0: [ 2] c1 02
col 1: [6105]
4d 41 43 4c 45 41 4e 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41

Category: Oracle

Tags:             12c       甲骨文中国

Permanent link to this entry

[转]【Oracle Database 12c新特性】32k varchar2 max_string_size的更多相关文章

  1. Maclean Liu对Oracle Database 12c新特性研究汇总

    Maclean Liu关于DB 12c新特性的研究文章如下: [Oracle Database 12c新特性] In-Database Archiving数据库内归档 [Oracle Database ...

  2. [翻译] Oracle Database 12c 新特性Multitenant

    译自官方白皮书http://www.oracle.com/technetwork/database/plug-into-cloud-wp-12c-1896100.pdf,包含新的云计算相关技术的介绍. ...

  3. Oracle Database 12c 新特性 - Pluggable Database

    在Oracle Database 12c中,可组装式数据库 - Pluggable Database为云计算而生.在12c以前,Oracle数据库是通过Schema来进行用户模式隔离的,现在,可组装式 ...

  4. Oracle GoldenGate 12c 新特性

    针对Oracle 12c的专门优化: 针对Oracle数据库的集成交付模式:提升在oracle DB中目标端的交付速度: 针对非Oracle数据库的协调交付模式:降低非oracle DB中多线程配置的 ...

  5. Oracle 12C 新特性之扩展数据类型(extended data type)

    Oracle 12C 新特性-扩展数据类型,在12c中,与早期版本相比,诸如VARCHAR2, NAVARCHAR2以及 RAW这些数据类型的大小会从4K以及2K字节扩展至32K字节.只要可能,扩展字 ...

  6. Oracle 12c 新特性之 数据库内归档(In-Database Archiving)

    Oracle Database 12c中引入了 In-Database Archiving的新特性, 该特性允许用户通过对表上的数据行标记为inactive不活跃的,以归档数据. 这些inactive ...

  7. Oracle 12c新特性

    转载自:Oracle 12c新特性(For DBA) 一: Multitenant Architecture (12.1.0.1)      多租户架构是Oracle 12c(12.1)的新增重磅特性 ...

  8. Oracle 12C 新特性之 db默认字符集AL32UTF8、PDB支持不同字符集

    一. db默认字符集AL32UTF8Specify the database character set when you create the database. Starting from Ora ...

  9. Oracle 12c 新特性 --- 新增对数据泵操作的审计跟踪

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/leo__1990/article/details/90199263 概念 Oracle Data P ...

随机推荐

  1. JS设置localStorage有效期

    localStorage是一个没有时间限制的数据存储,如果没有手动删除它,它将永久保存. 但是有些时候我们又需要它在一段时间后自动删除,这里我们可以对它进行扩展. var date = new Dat ...

  2. 状压DP学习笔记

    有的时候,我们会发现一些问题的状态很难直接用几个数表示,这个时候我们就会用到状压dp啦~~. 状压就是状态压缩,就是讲原本复杂难以描述的状态用一个数或者几个数来表示qwq.状态压缩是一个很常用的技巧, ...

  3. leetcode 16. 3Sum Closest JAVA

    题目: 给定一个包括n个整数的数组nums和一个目标值target.找到nums中的三个整数,使得他们之和与target最为接近.返回三个整数之和,假定每组输入只存在唯一答案 解题思路: 将nums数 ...

  4. jQuery find()方法 eq()方法

    find() 使用: 返回 <ul> 后代中所有的 <span> 元素: $(document).ready(function(){$("ul").find ...

  5. Linux 下 Wordpress "Not Found" 解决

    无题.仅仅记录解决过程: 原因是WEB目录下的.htaccess文件需要开启伪静态才能将文件重定向到其他地方.

  6. 关于java编译

    1.不包括jar编译 javac -cp %CLASSPATH% -d ./classes/ ./src/org/csource/common/*.java --先编译基础模块,并且指定class保存 ...

  7. HTML-利用CSS和JavaScript制作一个切换图片的网页

    由于个人原因,不详细写步骤 思路: 一.布局 二.制作图片区和按钮区的div及颜色.边框.背景属性等 三.用PS将四张图片剪切到同一个尺寸,重叠放置在图片切换区,透明度设置为0 四.点击对应按钮时,将 ...

  8. Codeforces Round #556 题解

    Codeforces Round #556 题解 Div.2 A Stock Arbitraging 傻逼题 Div.2 B Tiling Challenge 傻逼题 Div.1 A Prefix S ...

  9. 常见浏览器hack汇总

    1.背景渐变bug: ①.ie8 ie9:用滤镜的方式解决: -ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientT ...

  10. App功能测试的注意点

    好几个月没有写博客记录学习心得了,这次回老家深夜闲来无事写一篇记录下这段时间的面试心得,这次面试过程很多面试官都问APP的有关测试,下面我就自己的认识和工作中的经验来谈谈自己对APP测试的认识: 1. ...