zoukankan      html  css  js  c++  java
  • 关于ORACLE的GUID主键生成

    ============转自=============
     
     
    项目中若采用oracle数据库,则主键生成可以有两种方式,一是用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;
    从网络搜索得到的结论看,一般的意见总结为:
    1.SYS_GUID()比sequence复杂;
    2.SYS_GUID做主键,则表、索引存储开销多;
    3.SYS_GUID索引查询比sequence慢;
    但实际上,若每天5万条记录,则一年365*50000=18250000条记录,则理论上需要多耗费空间约合 1.46 GB 存储空间.显然,这些空间对当前的服务器的内存系统而言,影响并不大(按月分区), 就磁盘消耗而言都是微不足道的.
    查询的时候用guid和sequence执行计划也是差不多的,也就是查询效率并不一定差。
    从实践来看,使用SYS_GUID()做主键的优点多于负面影响。特别是在多个数据库数据集成时,GUID的优点显而易见。而关系数据库设计的法则约定:“主键不要代表任何意义”,更何况开发商既然提供这个功能而且一直在用,所以它的存在自有它的可取之处,因此建议采用guid。 
     
    的确,在现有项目中由于中小学数据库不在同一个数据库服务器上,user表中主建ID使用的是sequence方式。这样导致了项目在运行之2个库表的ID重复,很难整合在一起,因此想到了M记Sql Server中的GUID类型,使用它做为主键后跨主机跨数据库的ID重复将可以被有效解决,在将来可能的系统集成或迁移中将完全不受ID重复问题的困扰。
     
    下面是ORACLE中利用SYS_GUID ()函数实现兼容M记Sql Server中GUID类型规格的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;
    /
  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/zjw520/p/3036979.html
Copyright © 2011-2022 走看看