[20131116]12c的EXTENDED VARCHAR2与隐含参数_scalar_type_lob_storage_threshold.txt

简介: [20131116]12c的EXTENDED VARCHAR2与隐含参数_scalar_type_lob_storage_threshold.txt参考链接:http://space.
[20131116]12c的EXTENDED VARCHAR2与隐含参数_scalar_type_lob_storage_threshold.txt

参考链接:http://space.itpub.net/267265/viewspace-776806/

google查询了一些资料:

发现:
SYS@test01p> @hide _scalar_type_lob_storage_threshold;
NAME                                     DESCRIPTION                                                        DEFAULT_VALUE          SESSION_VALUE          SYSTEM_VALUE
---------------------------------------- ------------------------------------------------------------------ ---------------------- ---------------------- ----------------------
_scalar_type_lob_storage_threshold       threshold for VARCHAR2, NVARCHAR2, and RAW storage as BLOB         TRUE                   4000                   4000

--很明显这个参数可以控制字符串当作blob存储的长度,也就是缺省是4000.

--如果修改这个参数就可以控制存储长度是否选择blob方式保存的切换点。

SYS@test01p> alter system set "_scalar_type_lob_storage_threshold"=1048576;
System altered.

--奇怪设置很大的值,系统也能接受。

SYS@test01p> alter system set "_scalar_type_lob_storage_threshold"=6000;
System altered.

--这样长度小于等于6000的字符不会使用blob保存。

做一些测试看看:

SYS@test01p> @ver
BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

drop table t1 purge ;

SCOTT@test01p> select * from user_lobs;
no rows selected

--当前用户没有lob字段类型。

create table t1 ( id number,a varchar2(5000),b varchar2(6000) ,c varchar2(6001) );

SCOTT@test01p> column segment_name format a30
SCOTT@test01p> select table_name,segment_name from user_lobs;
TABLE_NAME SEGMENT_NAME
---------- ------------------------------
T1         SYS_LOB0000093538C00004$$

-- 可以发现仅仅第4个字段可能会使用lob段。这样可以实现大于4000的一些字符保存在块内,或者形成行链接的情况。

--建立索引看看,当然一般情况不会在这么长的字符串建立索引,仅仅看看是否成功。
SCOTT@test01p> create index i_t1_b on t1(b);
Index created.

SCOTT@test01p> create index i_t1_c on t1(c);
Index created.

--也许没有段的分配,插入数据看看。一般ORA-01450错误: maximum key length (6398) exceeded,没有操作限制。

SCOTT@test01p> insert into t1 values (1,lpad('a',5000,'a'),lpad('b',6000,'b'),lpad('c',6001,'c'));
1 row created.

SCOTT@test01p> commit ;
Commit complete.

--OK没有问题。
--这些大于4000的字符索引是不能做rebuild online 操作的。
SCOTT@test01p> alter index i_t1_b rebuild online  ;
alter index i_t1_b rebuild online
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01450: maximum key length (3215) exceeded

SCOTT@test01p> alter index i_t1_c rebuild   ;
Index altered.

--如果这时修改参数回来会出现什么情况呢?
SCOTT@test01p> alter system set "_scalar_type_lob_storage_threshold"=4000;
System altered.

SCOTT@test01p> select table_name,segment_name from user_lobs;
TABLE_NAME SEGMENT_NAME
---------- ------------------------------
T1         SYS_LOB0000093538C00004$$


SCOTT@test01p> insert into t1 values (2,lpad('a',5000,'a'),lpad('b',6000,'b'),lpad('c',6001,'c'));
1 row created.

SCOTT@test01p> commit ;
Commit complete.

SCOTT@test01p> select table_name,segment_name from user_lobs;
TABLE_NAME SEGMENT_NAME
---------- ------------------------------
T1         SYS_LOB0000093538C00004$$


--没有任何影响,T1表上没有建立新的段,因为前面表已经定义好了。
--当然这么长的字段建立索引没有意义,但是这个参数_scalar_type_lob_storage_threshold对于一些特殊需求还是不错的。
--比如如果应用中保存的字符串在4000上下,如果使用blob保存,8k的数据块至少浪费50%的空间,而设置
--_scalar_type_lob_storage_threshol=5000,可以很好的规避这些问题。
--当然这这些东西真要在生产系统使用还是要严格测试,谨慎使用!!

目录
相关文章
|
关系型数据库 MySQL 数据库
View ‘information_schema.SCHEMATA‘ references invalid table(s) or column(s) or function(s) or define
View ‘information_schema.SCHEMATA‘ references invalid table(s) or column(s) or function(s) or define
250 0
|
SQL
ORA-01440: column to be modified must be empty to decrease precision or scale
在修改表字段的NUMBER类型的精度或刻度时,你可能会遇到ORA-01440: column to be modified must be empty to decrease precision or scale,下面介绍一下,如何处理这个问题。
1612 0
|
SQL 存储 关系型数据库
LOB类型数据的MOVE
近日,新接手了一个数据库。检查某系统的时候发现,部分数据表存储在USERS表空间下了。我们怎么对LOB进行管理呢?
1588 0
|
SQL 数据库
LOW_VALUE、HIGH_VALUE、ENDPOINT_VALUE转换--UTL_RAW、DBMS_STATS.CONVERT_RAW_VALUE
LOW_VALUE、HIGH_VALUE、ENDPOINT_VALUE的转换--UTL_RAW、HEXSTR、DBMS_STATS.CONVERT_RAW_VALUE的使用 直方图ENDPOINT_VALUE转换:首先准备基础表:CREATE T...
1298 0
|
Oracle 关系型数据库 SQL
【MOS】EVENT: DROP_SEGMENTS - cleanup of TEMPORARY segments (文档 ID 47400.1)
【MOS】EVENT: DROP_SEGMENTS - Forcing cleanup of TEMPORARY segments (文档 ID 47400.1) ***Checked for relevance on 14-Jun-2012*** ...
1203 0
|
存储 关系型数据库 MySQL
InnoDB的行记录格式, Compact, Redundant, Compressed, Dynamic
InnoDB存储引擎和大多数数据库一样(如Oracle和Microsoft SQL Server数据库),记录是以行的形式存储的。这意味着页中保存着表中一行行的数据。到MySQL 5.1时,InnoDB存储引擎提供了Compact和Redundant两种格式来存放行记录数据,Redundant是为兼容之前版本而保留的,如果你阅读过InnoDB的源代码,会发现源代码中是用PHYSICAL RECORD(NEW STYLE)和PHYSICAL RECORD(OLD STYLE)来区分两种格式的。
1194 0
You cannot change a partition into an extended one or vice versa Delete it first
You cannot change a partition into an extended one or vice versa Delete it first 2015-08-07 16:23 by 潇湘隐者, 1211 阅读, 0 评论, 收藏, 编辑...
1286 0
|
SQL 关系型数据库 MySQL
ORA-01427single-row subquery returns more than one
今天改bug遇到了一个错误,如题.是别人改了我的sql,没经过严格的测试,后来发现改坏了.出错的语句如下 : select g.id, g.
843 0

热门文章

最新文章