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

[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,可以很好的规避这些问题。
--当然这这些东西真要在生产系统使用还是要严格测试,谨慎使用!!

时间: 2024-09-20 15:07:25

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

[20131116]12c的EXTENDED VARCHAR2与_scalar_type_lob_storage_threshold之2.txt

[20131116]12c的EXTENDED VARCHAR2与_scalar_type_lob_storage_threshold之2.txt 参考链接:http://space.itpub.net/267265/viewspace-776807/ google查询了一些资料: 发现:SYS@test01p> @hide _scalar_type_lob_storage_threshold;NAME                                     DESCRIPTION

[20131116]12c的EXTENDED VARCHAR2与CLOB字段.txt

[20131116]12c的EXTENDED VARCHAR2与CLOB字段.txt oracle 12c以前如果字符串长度超过4000,必须使用blob或者clob类型.12c开始支持超过4000的字符串长度,提高一些应用的灵活性,达到32K,避免一些字段定义为clob,blob类型,提高处理能力. 要支持这个特性,要执行 @?/rdbms/admin/utl32k.sql升级步骤.如果存在pdb库,还必须升级PDB$SEED,以及PDB数据库.参考链接:http://space.itpub.

[20171109]查看隐含参数脚本.txt

[20171109]查看隐含参数脚本.txt --//查看隐含参数的脚本,今天没事修改一下增加查询description字段的内容.也有网友要求提供这个脚本,实际上这些脚本都是自己工作 --//中不断收集整理.网上许多地方都能找到. $ cat hide.sql col name format a40 col description format a66 col session_value format a22 col default_value format a22 col system_va

[20151208]隐含参数_trace_pin_time.txt

[20151208]隐含参数_trace_pin_time.txt --使用隐含参数可以trace how long a current pin is held,作为测试与学习了解oracle内部相关知识. --自己测试看看. 1.测试环境: SYS@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------

[20170502]11G查询隐含参数视图.txt

[20170502]11G查询隐含参数视图GV$SYSTEM_PARAMETER3.txt --//oracle 存在许多隐含参数,一直以为oracle没有提供正常的视图查询该内容,实际上oracle 11G已经提供这方面的功能,只不过oracle并不公开. --//自己也是偶然发现: 1.环境: SYS@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER -------------------------

[20140318]隐含参数_db_block_max_cr_dba

[20140318]隐含参数_db_block_max_cr_dba .txt 许多人都知道隐含参数_db_block_max_cr_dba缺省6,可以做一些简单的测试: 1.建立测试环境: SCOTT@test> @ver BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11

[20130915]12c新特性 varchar2支持32K长度.txt

[20130915]12c新特性 varchar2支持32K长度.txt oracle 12c以前如果字符串长度超过4000,必须使用blob或者clob类型.12c开始支持超过4000的字符串长度,提高一些应用的灵活性,达到32K,避免一些字段定义为clob,blob类型,提高处理能力. 但是12c默认的方式不支持大于4000的字符串长度,必须经过一些步骤升级完成,自己测试如下: SYS@test> @ver BANNER                                    

[20140318]隐含参数_db_block_max_cr_dba 2

[20140318]隐含参数_db_block_max_cr_dba 2.txt 许多人都知道隐含参数_db_block_max_cr_dba缺省6,如果多个会话修改同一块呢?会发生什么情况: 参考链接做一次测试: 1.建立测试环境: SCOTT@test> @ver BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterpr

[20130916]12c Indexing Extended Data Types and index.txt

[20130916]12c Indexing Extended Data Types and index.txt http://richardfoote.wordpress.com/2013/09/12/12c-indexing-extended-data-types-part-i-a-big-hurt/ 参考以上链接,做一些测试: 1.测试环境: SCOTT@test01p> @ver BANNER