`
小苏_呵呵
  • 浏览: 12858 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

sys_guid()和传统的序列(sequence)比较

sql 
阅读更多
SYS_GUID (),是Oracle 8i 后提供的函数。SYS_GUID产生并返回一个全球唯一的标识符(原始值)由16个字节组成。在大多数平台,生成的标识符由主机标符,执行函数的进程或者线程标识符,和进程或线程的一个非重复的值(字节序列)组成。
Oracle8i引入了SYS_GUID这个概念,它同Oracle管理员所使用的传统的序列(sequence)相比具有诸多优势。一个序列生成器只是简单地创建从给定的起点开始的一系列整数值,而且它被用在选择陈述式的时候自动地递增该系列。 
  序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不适合将它用作并行或者远程环境里的主关键字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。
  序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则它就不能保证其值是唯一的)。SYS_GUID源自不需要对数据库进行访问的时间戳和机器标识符,这就节省了查询的消耗。 
  很多应用程序都依靠序列生成器来创建数据行的主关键字,这些数据行没有一个明显的主值,这也就是说,在这样的数据集里一条记录的创建就会让数据列发生改变。因此,管理员可能会对在表格中将SYS_GUID用作主关键字而不使用序列数感兴趣。这在对象在不同机器的不同数据库里生成以及需要在后来合并到一起的情况下很有用。
  但是,SYS_GUID所生成的值是一个16个字节的原始值。序列所生成的整数不会使用16字节(的值),除非它达到了10的30次方(每个字节两个16进制显示位),而且数字是相当独特的:
  SQL> select dump(123456789012345678901234567890) from dual;
  DUMP(123456789012345678901234567890)
  --------------------------------------------------------------
  Typ=2 Len=16: 207,13,35,57,79,91,13,35,57,79,91,13,35,57,79,91
  使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上的消耗;问题就是在那里。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。对序列而言,性能上的影响在查询期间,在这个时候,SGA序列的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被丢失。 
  SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为Web参数来传递。

性能比较:
 创建下列对象:
  create table tsg as select RAWTOHEX(sys_guid()) sgid,a.* from all_objects a;
  create SEQUENCE seq_tsg;
  create table tsg2 as select seq_tsg.nextval,a.* from all_objects a;
空间比较
  现在这两个表:tsg和tsg2拥有的行数相同,但大小不同:
  
      表         行数 Number Extents Size in bytes 索引大小
TSG(SYS_GUID主键) 50231      23           8388608 3145728
TSG2(Sequence主键) 50231      21           6291456 917504

 换言之,相同条件下,使用SYS_GUID做主键比用Sequence做主键,表多消耗了空间2097152 byte,索引多消耗2228224 byte,平均每行多消耗86.1 byte.
  考虑到生产环境下,每天5万条记录,则一年365*50000=18250000条记录,则理论上需要多耗费空间约合 1.43GB 存储空间.这些空间对磁盘消耗而言可以忽略不计,对内存仍然是有一定影响的,但就当前的服务器能力而言,影响有限,如果对表进行合理分区后,这种影响可以降低至极低。
执行计划比较
  比较唯一查询时的执行计划:
  对TSG执行:
  select owner
  from tsg
  where sgid = 'F36C09B7A7A84297995352D2409EB40E'
  对TSG2执行:
  select owner
  from tsg2
  where sgid = 99
  统计信息对比:从以上统计信息看,执行计划相同。
  可以预料到的是,由于使用SYS_GUID做主键,比较的是字符串,故耗费CPU要高些,因此,logical reads要高些,至于Physical Readers居然低一些,就不知道原因了(实际上二者基本都没有产生大量的物理读),估计是我的测试环境Db Cache太小的缘故.
  对于响应时间,这应该是计算机环境产生的影响,不能说明问题,这两条语句响应都很快,小于0.02秒.
小结
  从实践来看,使用SYS_GUID()做主键的优点多于负面影响。特别是在多个数据库数据集成时,GUID的优点显而易见.A项目最终没有采用客户定义的“货单唯一序号”作为主键,也是出于关系数据库设计的法则约定:“主键不要代表任何意义”。

分享到:
评论

相关推荐

    guid.zip_C# guid 算法_GUID 算法_guid 代码

    标签中的"c#_guid_算法 guid_算法 guid_代码"进一步强调了这个代码示例是关于`Guid`生成算法的实现。这意味着在压缩包内的`guid算法`文件很可能是C#源代码文件,里面可能包含了一个或多个自定义`Guid`生成器的类,...

    GUID.zip_guid_guid 生成器

    总结来说,"GUID.zip_guid_guid 生成器"是一个为开发者和IT专业人员设计的实用工具,它可以方便地生成和复制全局唯一的标识符。这个工具的使用简化了开发过程中的某些步骤,特别是在需要为对象、服务或文件分配唯一...

    ZLXA_GUID.zip

    在Oracle中,GUID通常用来替代传统的序列或主键,特别是在分布式系统或跨数据库同步的情况下。 全局唯一标识符(GUID)是一种128位的数字,由16个字节组成,转换为十六进制表示时通常为32个字符。它们设计为在全...

    100 guid_guid1c_

    标题中的"100 guid_guid1c_"似乎指的是一个与GUID(全局唯一标识符)相关的工具或资源,特别是与"1c"这个特定环境或版本有关。描述中提到的"get guid 1c"进一步证实了这是一个获取或处理1C环境下的GUID的工具。1C...

    GUID Generator.rar_generator_guid_tool

    标题中的"GUID Generator.rar_generator_guid_tool"表明这是一个用于生成全局唯一标识符(GUID)的工具。GUID,全称Global Unique Identifier,是由微软公司提出的一种在分布式系统中保证唯一性的标识符标准。它由...

    vs2019_GUID生成工具.rar

    标签“GUID的工具”和“vs2019”进一步明确了这个压缩包的主要内容,它是一个与Visual Studio 2019相关的,用于生成GUID的独立工具。 压缩包中的文件“guidgen.exe”很可能就是我们要找的GUID生成器。这是一个可...

    PyPI 官网下载 | django_guid-0.2.1-py3-none-any.whl

    该库可能包含了方便的模型字段和管理器方法,使得在Django应用中创建和管理GUID变得轻松简单。 在使用这个库之前,首先需要通过pip来安装。在命令行中输入以下命令: ```bash pip install django_guid-0.2.1-py3-...

    pdiusbd12.rar_PDIUSBD12 USB_USB SCH_d12_guid829_usb d12

    标签"pdiusbd12_usb usb_sch d12 guid829 usb_d12"是对主题内容的关键词提炼,便于搜索和分类。这些标签突出了PDIUSBD12、USB接口、电路图、D12芯片、GUID829以及与USB设备相关的其他信息。 在压缩包内的文件...

    OracleGoldenGate针对表没有主键或唯一索引的解决方案[归类].pdf

    需要在 Oracle GoldenGate 中配置表,以便使用 SYS_GUID 列来唯一标识行。 3. 参考文献 本文档中使用的软件组件: * Oracle Database 10.2 或更高版本 * Oracle GoldenGate 10.4 或更高版本 附录 A: 示例表配置 ...

    GUID.rar_guid

    全局唯一标识符(GUID,Globally Unique Identifier)是一种在信息技术领域中广泛使用的标识符,特别是在软件开发、数据库设计和网络编程中。GUID是由128位数字组成的,通常以32位十六进制的形式表示,例如:`{...

    mysql_guid主键生成方式范例

    在MySQL中,有几种方式可以生成GUID,包括`UUID()`函数和`BIN_TO_UUID()`函数。`UUID()`函数直接生成一个标准的UUID(即GUID),而`BIN_TO_UUID()`则用于将二进制形式的UUID转换为可读的字符串形式。 接下来,我们...

    ORCALE语句大全

    - 创建序列: `create sequence student_sequence increment by 1 start with 1 nomaxvalue nocycle nocache` - 创建触发器: `create trigger student_trigger before insert on student for each row when(new.SNo...

    guid.zip_The Hidden_guid

    This is a Visual Basic 6 project that creates a GUID. It contains the function "CreateGUIDStr()". This function returns a GUID. The function calls some APIs, but this work is hidden from the user. ...

    netcore_guid3.1.pdf

    标题和描述提及了“netcore_guid3.1.pdf”,文档的标题暗示了文档是一个关于.NET Core 3.1的指导手册或指南。.NET Core 3.1是一个广泛使用的开源、跨平台的.NET实现,用于创建现代网络应用、云服务以及其他应用程序...

    C#_GUID图片处理demo

    在本"C#_GUID图片处理demo"项目中,开发者运用了C#编程语言来实现了一系列的图片处理功能,包括但不限于转换图片为黑白效果和柔化处理。这些功能在图像处理领域有着广泛的应用,例如照片编辑、艺术创作以及图像分析...

    driver_Source.rar_guid829

    标题中的"driver_Source.rar_guid829"暗示了这是一个与驱动程序源代码相关的压缩包,可能包含一个特定的示例项目或教程,其中"guid829"可能是该资源的唯一标识符或者是某个特定版本的标记。描述指出是"D12 DDK 的...

    JBPM_Users_Guid

    JBPM(JBoss Business Process Management)是一款开源的工作流引擎,它支持业务流程管理(BPM)和业务流程建模(BPMN)标准。该指南《JBPM Users Guide》旨在为用户提供如何在JBoss Enterprise SOA Platform 4.2 CP04...

    user_guid.rar

    芯片后端综合流程工具DC 的uer guid、布局布线 ICC uer guid。 包含综合布局布线 基本流程、优化手段。也可以作为命令查询手册,包含基本tcl命令。做综合、ICC 等后端人员必备手册

    Guid-Generator.rar_guid

    VB.NET Guid 号码生成器代码,每点击一次按钮,即可生成一个GUID码,代码基于VS.NET2010环境,测试请先生成项目源码,然后运行Bin/Debug目录下的GuidGenerator.exe文件即可。运行界面如上图所示

Global site tag (gtag.js) - Google Analytics