你是否依然相信童话

数据类型的选用

上一篇 / 下一篇  2008-05-24 17:24:26 / 个人分类:SQL调优

在设计数据库时,选择正确的数据类型,往往可以避免很多的问题,正确理解数据库的类型,对于存储空间规划,应用性能调整都会很有帮助,我在网上摘录了些东东,并作如下整理ITPUB个人空间5TqO(z__h
ITPUB个人空间@.l:DX!uU*o
ITPUB个人空间q'KhE f @
1、Char
ITPUB个人空间-?Z h^~Ioo
定长格式字符串,在数据库中存储时不足位数填补空格,不建议使用,会带来不必要的麻烦ITPUB个人空间x&X/Q{x6A"S%_M
a、字符串比较的时候,如果不注意(char不足位补空格)会带来错误ITPUB个人空间BoSi|
b、字符串比较的时候,如果用trim函数,这样该字段上的索引就失效(有时候会带来严重性能问题)ITPUB个人空间 w1x ?1Z(^W L
c、浪费存储空间
oE-[L_{0O0
&T Hl2y-YY02、Varchar2/VarcharITPUB个人空间"DpK&Ms5~#t
不定长格式字符串,对于4000字节以内的字符串,建议都用该类型ITPUB个人空间KR$F?o.x
a、网上有说char比varchar2性能好,但是如果你有兴趣做测试的话,会发现没有区别(如果发生行迁移,可以通过pctfree来调整)ITPUB个人空间 Tqn?;[3Z{e C
b、充分利用存储空间ITPUB个人空间Yi*d&Z`7nzc,h$V

3、Long/long rawITPUB个人空间-V d4?9[k'G
Oracle已经废弃,只是为了向下兼容保留着,应该全部升级到lob
2J!^7GH&P3IJ*h#u0Long类型有很多限制
K^[@,yU0a、表中只能有一列long类型ITPUB个人空间8YsTC+g9K |9f4w|
b、Long类型不支持分布式事务
$A.ft5O+h0c、太多的查询不能在long上使用了
p/O `)z]DZ0ITPUB个人空间D"Pqf+C ]p)e#y0G
4、NumberITPUB个人空间@W2z4P ~;H
定义Number的方法:Number(p,s)ITPUB个人空间$G [e4Q%Ba3d
其中p,s都是可选的:ITPUB个人空间i]8r6U#_1Ri\
a、p代表精度,默认为38
:T#CX o"UF T&I+O+C0b、s代表小数位数,取值范围-84~127,默认取值要看是否指定了p,如果制定了p,默认s为0,如果没有指定p,默认取最大值。
_(b&{@v0
qBMW6|Ag0(注意:按照如下方法计算:整数位数<=p-s,小数位数<=sITPUB个人空间`GWX @g ^
当数据按照指定位数四舍五入后插入时,超出范围,数据库就要抛错。
bLFkoS+D7m{9u0其他的数值类型都是number的衍生,底层都是number,比如integer/int完全映射到number(38)
7Q$\fWak5s-]C0性能相关:number是一种软实现的类型,如果需要对number做复杂的运算,建议先用cast内置函数转换number为浮点数类型
c$U^ j`G0另外需要注意的一点是:number是变长类型,在计算表存储空间的时候要切记 )ITPUB个人空间,K}]c B$S?(q

*LoII:U |]c;~05、Date
v8r"Z8h5[uK-n3Dg I0Date类型是一个7字节的定长数据类型,没啥好说的,一个例子:性能a>b>c
9d!R~"nk&nL*b{0a、Where date_colum>=to_date(’01-jan-2007’,’dd-mon-yyyy’)
Ju E(~"aB\0b、Where trunc(date_colum,’y’)=to_date(’01-jan-2007’,’dd-mon-yyyy’)ITPUB个人空间UJG0Y&L'^'J u:C
c、Where to_char(date_colum,’yyyy’)=’2007’
v"IyQk)@LD0ITPUB个人空间r e/I$Z*p!qi0qq
6、 Timestamp/timestamp with time zone/timestamp with local time zoneITPUB个人空间X\1s3l@Q4{9Q @9J3{
和date类似,只不过它另外支持小数秒和时区。语法Timestamp(n),n指定秒的小数位数,取值范围0~9。可选。
J@O{C4k1y.Q\0ITPUB个人空间v I^e%t/}
7、Lob
"}4L d}i8d$h Cx t]x0Clob/blob实现是比较复杂的,这里只提提几个和性能相关的点,当然能不用lob尽量不用:
0L"H5r;?)A0a、 一个lob字段包括lobindex和lobsegmentITPUB个人空间 w%F'vBZ$gU#m
    Lob缺省可以存放在表中(表字段),条件是: 它的大小小于4kb,并且在定义的时候没有使用(disable storage inrow)字句(缺省是enable)ITPUB个人空间C'A]Kh,R"lV
    当lob大于4kb的时候它会被存放到lobsegment中
Kq;nc;l0c、当lob存放在表中的时候,它可以被缓存,对于它的操作效率远远高于存储在lobsegment中的lob(不用lobindex)ITPUB个人空间R8j"l&U%vM*G
d、 存储在lobsegment中的lob缺省不在缓冲区缓存,对于lob的读写都是物理IO,代价非常高,所以对于大于4kb的lob字段千万不要频繁更新,效率非常低ITPUB个人空间3IhuHt \[
e、 存储在lobsegment中的lob可以在定义的时候指定使用cache(默认是nocache),这对于中等大小的lob(比如几k~几十k)很有用处,同时,它还可以减少物理IO。

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-12-06  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 256
  • 日志数: 7
  • 建立时间: 2008-04-29
  • 更新时间: 2008-08-18

RSS订阅

Open Toolbar