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