varchar2(10)和varchar2(1000)的区别

今天早上检查决策信息平台数据抽取日志时发现几个错误[ORA-01438: value larger than specified precision allows for this column],经检查发现原因在于源数据的表结构被改变,由原来的varchar(50)增加到了varchar(500),并且源数据中有数据长度超过了200个字符.
    或者我们将目的数据表定义为足够大(比如varchar2(4000))可以避免这个问题,但有如下几点原因限制这种方式的使用.
    1,复合索引的单个key长度有限制,根据每台服务器设置不同,其限定值有所不同,但一般限定为单个数据页长度的75%,如果一台机器的单个数据页为8K,那么复合索引长度不能超过6398个字节.否则会出现错误ora-01450.
    2,应用程序中为检索结果预分配的内存大小依赖于数据字典中定义的列长度,比如对两个分别定义为varchar(30),varchar(3000)的列,java或者其他应用程序为其分配的内存大小有很大区别的,这样在很多字段都定义为很大的长度时会严重消耗应用服务器的内存,降低程序性能.
    3,oracle在执行检索前建立的查询优化树和策略分配都依赖于数据字典中定义的字段长度而不是其实际存储的字段大小,除非我们对表执行了analyze以获得统计信息,但事实上我们的后台对象目前都没有定期执行分析的习惯.
    4,如果定义为varchar2(4000)的字段需要跟其他表进行连接以获取检索结果,执行连接操作之前需要将两个连接的字段转换为类型相同的字段,在可以兼容时倾向于转换为容量较大的类型,这样不但消耗了转换时间,而且也增加了内存消耗.
   鉴于以上原因,我们不能毫无限制的通过增加服务器上的表字段大小来解决这种偶发错误,而需要源数据维护者在执行表结构修改时给我们一个通知,以便我们作出对应的修改,从而避免类似错误的发生.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值