認(rèn)識oracle數(shù)據(jù)類型

          作者:tacy lee

          在設(shè)計(jì)數(shù)據(jù)庫的時(shí)候,選擇正確的數(shù)據(jù)類型,往往可以避免很多的問題,正確理解數(shù)據(jù)庫的類型,對于存儲空間規(guī)劃,應(yīng)用性能調(diào)整都會很有幫助,下面是我個(gè)人的一點(diǎn)總結(jié):
           
          1、 Char
          定長格式字符串,在數(shù)據(jù)庫中存儲時(shí)不足位數(shù)填補(bǔ)空格,不建議使用,會帶來不必要的麻煩
          a、  字符串比較的時(shí)候,如果不注意(char不足位補(bǔ)空格)會帶來錯(cuò)誤
          b、  字符串比較的時(shí)候,如果用trim函數(shù),這樣該字段上的索引就失效(有時(shí)候會帶來嚴(yán)重性能問題)
          c、  浪費(fèi)存儲空間
           
          2、 Varchar2/Varchar
          不定長格式字符串,對于4000字節(jié)以內(nèi)的字符串,建議都用該類型
          a、  網(wǎng)上有說char比varchar2性能好,但是如果你有興趣做測試的話,會發(fā)現(xiàn)沒有區(qū)別(如果發(fā)生行遷移,可以通過pctfree來調(diào)整)
          b、  充分利用存儲空間
           
          3、 Long/long raw
          Oracle已經(jīng)廢棄,只是為了向下兼容保留著,應(yīng)該全部升級到lob
          Long類型有很多限制
          a、  表中只能有一列l(wèi)ong類型
          b、  Long類型不支持分布式事務(wù)
          c、  太多的查詢不能在long上使用了
           
          4、 Number
          定義Number的方法:Number(p,s)
          其中p,s都是可選的:
          a、  p代表精度,默認(rèn)為38
          b、  s代表小數(shù)位數(shù),取值范圍-84~127,默認(rèn)取值要看是否指定了p,如果制定了p,默認(rèn)s為0,如果沒有指定p,默認(rèn)取最大值。
          幾個(gè)例子:
          a、  Number(5,0)=Number(5) 取值范圍99999~-99999
          b、  Number(5,2) 取值范圍999.99~-999.99
          注意:其中的整數(shù)位數(shù)只有3位,小數(shù)位數(shù)有2位,按照如下方法計(jì)算:
                整數(shù)位數(shù)<=p-s
                小數(shù)位數(shù)<=s
          如果插入123.555存儲在數(shù)據(jù)庫中變成123.56 (在小數(shù)的第三位上四舍五入),如果插入999.999,數(shù)據(jù)庫就要拋錯(cuò)。
          c、  Number(5,-2) 取值范圍9999900~-9999900 (整數(shù)位數(shù)<=p-s,沒有小數(shù)位數(shù))
          如果插入9999949存儲在數(shù)據(jù)庫中變成9999900(在整數(shù)的第二位上四舍五入),如果插入9999950,數(shù)據(jù)庫就要拋錯(cuò)。
          其他的數(shù)值類型都是number的衍生,底層都是number,比如integer/int完全映射到number(38)
          性能相關(guān):number是一種軟實(shí)現(xiàn)的類型,如果需要對number做復(fù)雜的運(yùn)算,建議先用cast內(nèi)置函數(shù)轉(zhuǎn)換number為浮點(diǎn)數(shù)類型
          另外需要注意的一點(diǎn)是:number是變長類型,在計(jì)算表存儲空間的時(shí)候要切記
           
          5、 Date
          Date類型是一個(gè)7字節(jié)的定長數(shù)據(jù)類型,沒啥好說的,一個(gè)例子:性能a>b>c
          a、Where date_colum>=to_date(’01-jan-2007’,’dd-mon-yyyy’)
             and date_colum< DIV>

          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類似,只不過它另外支持小數(shù)秒和時(shí)區(qū)。語法Timestamp(n),n指定秒的小數(shù)位數(shù),取值范圍0~9。可選。
           
          7、 Lob
          Clob/blob實(shí)現(xiàn)是比較復(fù)雜的,這里只提提幾個(gè)和性能相關(guān)的點(diǎn),當(dāng)然能不用lob盡量不用:
          a、  一個(gè)lob字段包括lobindex和lobsegment
          b、  Lob缺省可以存放在表中(表字段),條件是:
               1.它的大小小于4kb
               2.并且在定義的時(shí)候沒有使用(disable storage inrow)字句(缺省是enable)
               當(dāng)lob大于4kb的時(shí)候它會被存放到lobsegment中
          c、  當(dāng)lob存放在表中的時(shí)候,它可以被緩存,對于它的操作效率遠(yuǎn)遠(yuǎn)高于存儲在lobsegment中的lob(不用lobindex)
          d、  存儲在lobsegment中的lob缺省不在緩沖區(qū)緩存,對于lob的讀寫都是物理IO,代價(jià)非常高,所以對于大于4kb的lob字段千萬不要頻繁更新,效率非常低
          e、  存儲在lobsegment中的lob可以在定義的時(shí)候指定使用cache(默認(rèn)是nocache),這對于中等大小的lob(比如幾k~幾十k)很有效果,減少物理IO

          posted on 2007-09-07 17:10 tacy lee 閱讀(1558) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          主站蜘蛛池模板: 云龙县| 黄龙县| 吴忠市| 江城| 张家港市| 玉树县| 盈江县| 昭通市| 绵竹市| 聊城市| 肇东市| 拉孜县| 色达县| 武冈市| 乾安县| 鹤庆县| 深州市| 陇川县| 安泽县| 志丹县| 十堰市| 彝良县| 富裕县| 全州县| 阜康市| 沈阳市| 扬州市| 南召县| 丹江口市| 易门县| 丹棱县| 石渠县| 黔江区| 永登县| 兴文县| 萍乡市| 文水县| 夏河县| 赤壁市| 新沂市| 华阴市|