数据类型的选用

在设计数据库时,选择正确的数据类型,往往可以避免很多的问题,正确理解数据库的类型,对于存储空间规划,应用性能调整都会很有帮助,我在网上摘录了些东东,并作如下整理


1、Char

定长格式字符串,在数据库中存储时不足位数填补空格,不建议使用,会带来不必要的麻烦
a、字符串比较的时候,如果不注意(char不足位补空格)会带来错误
b、字符串比较的时候,如果用trim函数,这样该字段上的索引就失效(有时候会带来严重性能问题)
c、浪费存储空间

2、Varchar2/Varchar
不定长格式字符串,对于4000字节以内的字符串,建议都用该类型
a、网上有说char比varchar2性能好,但是如果你有兴趣做测试的话,会发现没有区别(如果发生行迁移,可以通过pctfree来调整)
b、充分利用存储空间

3、Long/long raw
Oracle已经废弃,只是为了向下兼容保留着,应该全部升级到lob
Long类型有很多限制
a、表中只能有一列long类型
b、Long类型不支持分布式事务
c、太多的查询不能在long上使用了

4、Number
定义Number的方法:Number(p,s)
其中p,s都是可选的:
a、p代表精度,默认为38
b、s代表小数位数,取值范围-84~127,默认取值要看是否指定了p,如果制定了p,默认s为0,如果没有指定p,默认取最大值。

(注意:按照如下方法计算:整数位数<=p-s,小数位数<=s
当数据按照指定位数四舍五入后插入时,超出范围,数据库就要抛错。
其他的数值类型都是number的衍生,底层都是number,比如integer/int完全映射到number(38)
性能相关:number是一种软实现的类型,如果需要对number做复杂的运算,建议先用cast内置函数转换number为浮点数类型
另外需要注意的一点是:number是变长类型,在计算表存储空间的时候要切记 )

5、Date
Date类型是一个7字节的定长数据类型,没啥好说的,一个例子:性能a>b>c
a、Where date_colum>=to_date(’01-jan-2007’,’dd-mon-yyyy’)
b、Where trunc(date_colum,’y’)=to_date(’01-jan-2007’,’dd-mon-yyyy’)
c、Where to_char(date_colum,’yyyy’)=’2007’

6、 Timestamp/timestamp with time zone/timestamp with local time zone
和date类似,只不过它另外支持小数秒和时区。语法Timestamp(n),n指定秒的小数位数,取值范围0~9。可选。

7、Lob
Clob/blob实现是比较复杂的,这里只提提几个和性能相关的点,当然能不用lob尽量不用:
a、 一个lob字段包括lobindex和lobsegment
    Lob缺省可以存放在表中(表字段),条件是: 它的大小小于4kb,并且在定义的时候没有使用(disable storage inrow)字句(缺省是enable)
    当lob大于4kb的时候它会被存放到lobsegment中
c、当lob存放在表中的时候,它可以被缓存,对于它的操作效率远远高于存储在lobsegment中的lob(不用lobindex)
d、 存储在lobsegment中的lob缺省不在缓冲区缓存,对于lob的读写都是物理IO,代价非常高,所以对于大于4kb的lob字段千万不要频繁更新,效率非常低
e、 存储在lobsegment中的lob可以在定义的时候指定使用cache(默认是nocache),这对于中等大小的lob(比如几k~几十k)很有用处,同时,它还可以减少物理IO。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14019112/viewspace-310139/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14019112/viewspace-310139/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值