关于ORACLE的GUID主键生成
生活随笔
收集整理的這篇文章主要介紹了
关于ORACLE的GUID主键生成
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
============轉(zhuǎn)自============= http://blog.sina.com.cn/s/blog_53d3c24a0100mplc.html 項目中若采用oracle數(shù)據(jù)庫,則主鍵生成可以有兩種方式,一是用sys_guid(),二是定義一個sequence,然后用nextval得到ID。
Oracle的定義sequence例子:
create sequence seq_test
minvalue 10000
maxvalue 99999999999999999
start with 20000
increment by 1
cache 20
cycle
order;
從網(wǎng)絡搜索得到的結(jié)論看,一般的意見總結(jié)為:
1.SYS_GUID()比sequence復雜;
2.SYS_GUID做主鍵,則表、索引存儲開銷多;
3.SYS_GUID索引查詢比sequence慢;
但實際上,若每天5萬條記錄,則一年365*50000=18250000條記錄,則理論上需要多耗費空間約合 1.46 GB 存儲空間.顯然,這些空間對當前的服務器的內(nèi)存系統(tǒng)而言,影響并不大(按月分區(qū)), 就磁盤消耗而言都是微不足道的.
查詢的時候用guid和sequence執(zhí)行計劃也是差不多的,也就是查詢效率并不一定差。
從實踐來看,使用SYS_GUID()做主鍵的優(yōu)點多于負面影響。特別是在多個數(shù)據(jù)庫數(shù)據(jù)集成時,GUID的優(yōu)點顯而易見。而關系數(shù)據(jù)庫設計的法則約定:“主鍵不要代表任何意義”,更何況開發(fā)商既然提供這個功能而且一直在用,所以它的存在自有它的可取之處,因此建議采用guid。? 的確,在現(xiàn)有項目中由于中小學數(shù)據(jù)庫不在同一個數(shù)據(jù)庫服務器上,user表中主建ID使用的是sequence方式。這樣導致了項目在運行之2個庫表的ID重復,很難整合在一起,因此想到了M記Sql Server中的GUID類型,使用它做為主鍵后跨主機跨數(shù)據(jù)庫的ID重復將可以被有效解決,在將來可能的系統(tǒng)集成或遷移中將完全不受ID重復問題的困擾。 下面是ORACLE中利用SYS_GUID ()函數(shù)實現(xiàn)兼容M記Sql Server中GUID類型規(guī)格的GUID串: CREATE OR REPLACE FUNCTION GET_GUID
???RETURN CHAR
IS
???v_guid??????????????CHAR (38);
???v_guid_part_one?????CHAR (8);
???v_guid_part_two?????CHAR (4);
???v_guid_part_three???CHAR (4);
???v_guid_part_four????CHAR (4);
???v_guid_part_five????CHAR (12);
BEGIN
???SELECT SYS_GUID ()
?????INTO v_guid
?????FROM DUAL; v_guid_part_one := SUBSTR (v_guid, 0, 8);
???v_guid_part_two := SUBSTR (v_guid, 8, 4);
???v_guid_part_three := SUBSTR (v_guid, 12, 4);
???v_guid_part_four := SUBSTR (v_guid, 16, 4);
???v_guid_part_five := SUBSTR (v_guid, 20, 12);
???v_guid :=
????CONCAT
?????(CONCAT
????????('{',CONCAT
???????????(CONCAT
???????????????(CONCAT
???????????????????(CONCAT (CONCAT (CONCAT (CONCAT (CONCAT (v_guid_part_one,
????????????????????????????????????????????????????????????'-'),
????????????????????????????????????????????????????v_guid_part_two
???????????????????????????????????????????????????),
????????????????????????????????????????????'-'
???????????????????????????????????????????),
????????????????????????????????????v_guid_part_three
???????????????????????????????????),
????????????????????????????'-'
???????????????????????????),
????????????????????v_guid_part_four
???????????????????),
????????????????'-'
???????????????),
????????????v_guid_part_five
???????????)
????),
???'}'
??);
???RETURN (v_guid);
END GET_GUID;
/
Oracle的定義sequence例子:
create sequence seq_test
minvalue 10000
maxvalue 99999999999999999
start with 20000
increment by 1
cache 20
cycle
order;
從網(wǎng)絡搜索得到的結(jié)論看,一般的意見總結(jié)為:
1.SYS_GUID()比sequence復雜;
2.SYS_GUID做主鍵,則表、索引存儲開銷多;
3.SYS_GUID索引查詢比sequence慢;
但實際上,若每天5萬條記錄,則一年365*50000=18250000條記錄,則理論上需要多耗費空間約合 1.46 GB 存儲空間.顯然,這些空間對當前的服務器的內(nèi)存系統(tǒng)而言,影響并不大(按月分區(qū)), 就磁盤消耗而言都是微不足道的.
查詢的時候用guid和sequence執(zhí)行計劃也是差不多的,也就是查詢效率并不一定差。
從實踐來看,使用SYS_GUID()做主鍵的優(yōu)點多于負面影響。特別是在多個數(shù)據(jù)庫數(shù)據(jù)集成時,GUID的優(yōu)點顯而易見。而關系數(shù)據(jù)庫設計的法則約定:“主鍵不要代表任何意義”,更何況開發(fā)商既然提供這個功能而且一直在用,所以它的存在自有它的可取之處,因此建議采用guid。? 的確,在現(xiàn)有項目中由于中小學數(shù)據(jù)庫不在同一個數(shù)據(jù)庫服務器上,user表中主建ID使用的是sequence方式。這樣導致了項目在運行之2個庫表的ID重復,很難整合在一起,因此想到了M記Sql Server中的GUID類型,使用它做為主鍵后跨主機跨數(shù)據(jù)庫的ID重復將可以被有效解決,在將來可能的系統(tǒng)集成或遷移中將完全不受ID重復問題的困擾。 下面是ORACLE中利用SYS_GUID ()函數(shù)實現(xiàn)兼容M記Sql Server中GUID類型規(guī)格的GUID串: CREATE OR REPLACE FUNCTION GET_GUID
???RETURN CHAR
IS
???v_guid??????????????CHAR (38);
???v_guid_part_one?????CHAR (8);
???v_guid_part_two?????CHAR (4);
???v_guid_part_three???CHAR (4);
???v_guid_part_four????CHAR (4);
???v_guid_part_five????CHAR (12);
BEGIN
???SELECT SYS_GUID ()
?????INTO v_guid
?????FROM DUAL; v_guid_part_one := SUBSTR (v_guid, 0, 8);
???v_guid_part_two := SUBSTR (v_guid, 8, 4);
???v_guid_part_three := SUBSTR (v_guid, 12, 4);
???v_guid_part_four := SUBSTR (v_guid, 16, 4);
???v_guid_part_five := SUBSTR (v_guid, 20, 12);
???v_guid :=
????CONCAT
?????(CONCAT
????????('{',CONCAT
???????????(CONCAT
???????????????(CONCAT
???????????????????(CONCAT (CONCAT (CONCAT (CONCAT (CONCAT (v_guid_part_one,
????????????????????????????????????????????????????????????'-'),
????????????????????????????????????????????????????v_guid_part_two
???????????????????????????????????????????????????),
????????????????????????????????????????????'-'
???????????????????????????????????????????),
????????????????????????????????????v_guid_part_three
???????????????????????????????????),
????????????????????????????'-'
???????????????????????????),
????????????????????v_guid_part_four
???????????????????),
????????????????'-'
???????????????),
????????????v_guid_part_five
???????????)
????),
???'}'
??);
???RETURN (v_guid);
END GET_GUID;
/
轉(zhuǎn)載于:https://www.cnblogs.com/zjw520/archive/2013/04/23/3036979.html
總結(jié)
以上是生活随笔為你收集整理的关于ORACLE的GUID主键生成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据字典视图
- 下一篇: 关闭应用程序的几种方法