1、由于数据库的限制(参见Logical Database Limits),每个索引的字段的总长度不能超过75% * the database block size再减去some overhead的长度,由于有限制,所以字段的长度也限制了索引字段的大小: SQL> create table x( 2 a varchar2(2000), 3 b varchar2(2000), 4 c varchar2(2000), 5 d varchar2(2000), 6 e varchar2(2000));表已创建。SQL> create table y( 2 a varchar2(10), 3 b varchar2(10), 4 c varchar2(10), 5 d varchar2(10), 6 e varchar2(10));表已创建。SQL> create index y_idx on y(a,b,c,d);索引已创建。SQL> create index x_idx on x(a,b,c,d); create index x_idx on x(a,b,c,d) * 第 1 行出现错误: ORA-01450: 超出最大的关键字长度 (6398)2、字段长度能够起到一定的constraint作用,比如一个字段长度要求是10个字节,必须要设置为varchar2(10)。 3、如果用到ARRAY FETCH,那么客户端fetch 数据需要的内存是根据定义的字段的长度,所以大的字段会需要大的内存。比如10个VARCHAR2(4000)字段,我要取100行,那么就需要 4000*10*100的内存,大约是4M,但是如果定义为VARCHAR2(10),那么就需要10*10*100的内存。
根据系统字段定义取值,比如姓名,varchar2(10)就可以了,因为很少有超过5个汉字的。
小弟这两天在设计数据库,在定义可变长度时有一个很弱弱的问题要请教大家。大家在定义varchar2时长度一般如何取值?为什么在定义varchar2时不直接取最大值4000呢?这样有什么不好吗?
[/Quote根据实际情况 设计长度
SQL> create table x(
2 a varchar2(2000),
3 b varchar2(2000),
4 c varchar2(2000),
5 d varchar2(2000),
6 e varchar2(2000));表已创建。SQL> create table y(
2 a varchar2(10),
3 b varchar2(10),
4 c varchar2(10),
5 d varchar2(10),
6 e varchar2(10));表已创建。SQL> create index y_idx on y(a,b,c,d);索引已创建。SQL> create index x_idx on x(a,b,c,d);
create index x_idx on x(a,b,c,d)
*
第 1 行出现错误:
ORA-01450: 超出最大的关键字长度 (6398)2、字段长度能够起到一定的constraint作用,比如一个字段长度要求是10个字节,必须要设置为varchar2(10)。
3、如果用到ARRAY FETCH,那么客户端fetch 数据需要的内存是根据定义的字段的长度,所以大的字段会需要大的内存。比如10个VARCHAR2(4000)字段,我要取100行,那么就需要 4000*10*100的内存,大约是4M,但是如果定义为VARCHAR2(10),那么就需要10*10*100的内存。