我的上两个专栏中已经介绍到了与版本 8 功能相关的主题。我们可能需要在今天设计的数据库和应用程序中考虑这些功能。我们已经谈论了新的数据分区的辅助索引和附加的索引修改。在上一期中,我们了解了 DSSIZE 如何可以影响今后的分区策略。现在,我想要简要地来介绍一下 Sequence 对象以及如何用它们来代替 Identity 列。我们还将介绍版本 8 中一些用以使用 Identity 列的新功能。

数字生成问题

过去的许多应用程序都需要能够生成序号(例如获取下一个可用的帐号)。问题是该工作通常是通过用单个控制表存储这些数字,然后用可重复读(Repeatable Read)的 SELECT MAX 在随后的 INSERT 中检索并使用该数字来完成的。常常有多个事务需要使用该表,而这就导致了应用程序中无法解决的单点竞争。这是由于每次只有一个事务可以检索下一值,因为事务必须锁定该表以使数字增量。请参阅图 1。

在过去多年中曾经尝试过许多创造性的解决方案,例如使用行级的锁定,但是这些技术产生的系统开销加上成千上万个并发事务间的冲突仍然会导致性能瓶颈。如果用于数据共享的环境中,其中将有多个成员使用该表,那么它也会导致单点故障并且产生巨大的锁定开销。


   

Identity 列

因而在较晚的版本 6 中就出现了 Identity 列,用以解决前面提到的问题。如果一个表指派了 Identity 列,那么当向该表插入一行时,将根据 Identity 列的定义(START WITH 和 INCREMENT BY 值)来填充它。虽然使用 Identity 列要远胜于使用单个控制表,但是 Identity 列在使用方面却非常有限并且存在管理问题。

在版本 8 之前,Identity 列还带来了一些问题,例如:

  • 如何获得 Identity 列的值来填充 RI 有关的表?
  • 如何在插入之前获取值?
  • 如何重新设置或更改 Identity 列的值?

这还仅仅只是一部分问题。许多公司围绕这些问题开发了一种方法,他们从表中删除 Identity 列然后创建一个只含 Identity 列及其生成值的表。因此,上述问题,例如重新开始 Identity 列的值或填充 RI 有关的表,都可以通过使 Identity 列与表分离而得到解决。该技术仍然允许由 DB2 来填充 Identity 列的值,并且减少了许多限制。但还是必须要对该表进行填充、访问和维护,并且它无法解决 Identity 列的所有问题以及无法完全开发与由 DB2 执行数字生成相关的潜在性能。图 2 是一个展示如何使用该技术的例子。

版本 8 已经缓解了上述 Identity 列的部分问题,例如使用 SELECT 功能中的新的 INSERT 进行插入之前可以获得 Identity 列的值。下面这个例子展示了如何在插入时使用该功能来获取 Identity 列的值。

(假定所创建的表以自动生成的 ACCT_ID 为 Identity 列)

例 1  
   SELECT ACCT_ID  
   FROM FINAL TABLE  
      (INSERT INTO UID1.ACCOUNT (NAME, TYPE, BALANCE)  
      VALUES ('Master Card', 'Credit', 50000) )  

版本 8 中还可以更改其他一些值,例如:

   CACHE/NO CACHE  
   CYCLE/NO CYCLE  
   MINVALUE  
   MAXVALUE  
   INCREMENT BY  
   RESTART WITH

这些执行更改的功能,特别是 RESTART WITH,给 Identity 列的使用带来了更大的灵活性。然而,这些功能是定义在单个表上的,这一本质使它们仍然受到了一些限制,而且应用程序对它们的利用也仍然有限。此外,这些更改还将导致表空间被置于 REORG 暂挂状态,从而导致表无法获得表空间。


   

Sequence 对象

在首次宣布 Sequence 对象时,我认为它们只是为了将应用程序从其他数据库移植到 DB2 而向 DB2 添加的另一功能。但是我越是深入地研究它们,就越是开始喜欢这些新的对象了,因为它们消除了我们对于 Identity 列的许多限制,而且它们还具有许多独特且有用的功能。它还向我们提供了数字生成的另一备选方法。

Sequence 对象是用户定义的对象,用以根据其创建规范生成数值序列。 它们提供一个由 DB2 生成的增量计数器,并且与 Identity 列十分相似。可将 Identity 列当作一种特殊的 Sequence 对象;但是,sequence 列与表是分开的。

Sequence 对象值可因为各种理由而用于应用程序中。这样做有一些好处,例如:

  • 无需等待值的增加;
  • 独立的连续数字生成对象(不与表关联);
  • 递增或递减地生成数字;
  • 用于从其他数据库移植应用程序;
  • 可以生成键,用以跨多个表(RI 或相关的应用程序)协调各键。

序列名由两部分组成:128 字节的模式名和 128 字节的标识符。它们是通过新的 CREATE SEQUENCE 语句创建的,并且其所有属性完全都是由用户定义的(您也可以使用默认值)。Sequence 对象中的值可以是任何数字数据类型。初值是用 START WITH 值定义的,而增量则是由 INCREMENT BY(递增的或递减的)定义的。可以缓存这些值或按请求次序来生成。

下面这个例子展示了一个 Sequence 对象的创建及其简单用法。

   CREATE SEQUENCE ACCOUNT_SEQ  
      AS INTEGER  
      START WITH 1  
      INCREMENT BY 10  
      CYCLE  
      CACHE 20 

正如您所看到的,Sequence 对象的使用方法与许多人对于 Identity 列的使用比较相似。但是这更为有效,而且 Sequence 对象有一些极佳的使用优点。例如可以使用 NEXT VALUE FOR 和 PREVIOUS VALUE FOR。NEXTVALUE FOR 将为 Sequence 对象生成并返回下一值。而 PREVIOUS VALUE FOR 将为 Sequence 对象生成并返回前一值。这些语句可用于下列地方:

  • SELECT 和 SELECT INTO 语句;
  • INSERT 语句里面的 fullselect 的 SELECT 从句;
  • UPDATE 语句里面的 SET 从句(搜索或定位);
  • SET 主变量;
  • VALUES 或 VALUES INTO;
  • CREATE PROCEDURE、FUNCTION、TRIGGER。

下面的例子(右边的表 2)展示了这些语句的用法:  
     假定 ACCT_SEQ 为 START WITH 10 INCREMENT BY 10

正如您所看到的,使用 Sequence 对象代替 Identity 列有许多好处。下面是两者的一个简单比较。

Sequence 对象与 Identity 列
Sequence 对象 Identity 列(带有 V8 功能)
单独的 Sequence 对象是在用户请求时创建的 由 DB2 生成/维护和填充的内部 Sequence 对象
可用于它们所选择的任何目的,并且存在有多个 与特定的表相关联,并且只能有一个
循环(CYCLE)将回绕和重复,并且无需进行惟一性考虑 如果惟一索引在 Identity 列上并且创建了复制,那么循环(CYCLE)可能会产生问题
当用于填充表时,后来可被更新 如果是 GENERATED ALWAYS,就无法被更新
可以更改(ALTER)Sequence 对象的属性。  
还可以进行注释(COMMENT)以及授予/撤销(GRANT/REVOKE)权限
只能更改表(ALTER TABLE)(如果向已填充的表添加 Identity 列,将被置于 REORG 暂挂状态)
可被删除 不能从表中删除*
支持 NEXT VALUE FOR EXPRESSION 和 PREVIOUS VALUE FOR EXPRESSION 必须使用 ID_VAL_LOCAL 并且只返回用户提交(commit)范围内的最后值
*  如果今后设计中使用 Sequence 对象比使用 Identity 列更好,那么在选择 Identity 列时就要考虑仔细。如果它们是在已填充的表上定义的并且需要被删除,那么必须删除表然后重新创建。这对于高效环境中的大型表可能是一个大问题。

   

结束语

Identity 列和 Sequence 对象在我们的设计中都占有一席之地。鉴于它们都可以达到相同的目的 —— 生成序号,所以应该由您来选择哪一个更适合您。这将取决于您对生成的数字所需的灵活性,以及应用程序将如何使用这些数字。

db2 sequence的更多相关文章

  1. db2 sequence 查询

    1. 查询名字 select * from sysibm.sysequences where seqname='wx_Id' 2.nextVal select wx_seq_id.currval fr ...

  2. mysql 实现类似Oracle 或 db2 sequence

    第一步:创建一个索引管理表,其中包含,索引名称.最小值.最大值.当前值.增量,并设置主键为索引名称. CREATE TABLE TB_SEQUENCE ( SEQ_NAME VARCHAR(50) N ...

  3. Hibernatel框架基础使用

    Hibernatel框架基础使用 1.简介 1.1.Hibernate框架由来 Struts:基于MVC模式的应用层框架技术 Hibernate:基于持久层的框架(数据访问层使用)! Spring:创 ...

  4. hibernate理解

    SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate,基于持久层的框架(数据访问层使用)! Spring,创建对象处理对象的依赖关系以及框架整合! Dao代码,如何编 ...

  5. Hibernate-细细道来-01

    Dao代码,如何编写? 使用Jdbc技术,原始的jdbc操作, Connection/Statement/ResultSet DbUtils组件, 轻量级的dao的组件: Hibernate技术  [ ...

  6. Java-Hirbernate小结大纲

    Hibernate Hibernate是一个开放源代码的对象关系映射框架 Hibernate的核心接口一共有6个,分别为:Session.SessionFactory.Transaction.Quer ...

  7. hibernate的常用配置

    hibernate.cfg.xml的一些相关配置 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Co ...

  8. Hibernate框架--配置,映射,主键

    SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate,    基于持久层的框架(数据访问层使用)! Spring,   创建对象处理对象的依赖关系以及框架整合! Da ...

  9. Hibernate.cfg.xml 主配置

    <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hiber ...

随机推荐

  1. 文字溢出显示省略号,兼容ie9以上浏览器

    最近遇上一个问题,文字溢出展示省略号在ie上不管用,经过查找,是少了word-wrap: normal;这个css属性 width:100px; overflow: hidden; white-spa ...

  2. Java中Object转化为int类型

    转自:http://blog.sina.com.cn/s/blog_5f8421fb010162kb.html Java中由Object类型转化为int类型时,不能直接转化,先是将Object类型转化 ...

  3. 7.12归来赛_B

    Prime Judge 时间限制 1000 ms 内存限制 65536 KB 题目描写叙述 众所周知.假设一个正整数仅仅能被1和自身整除,那么该数被称为素数.题目的任务非常easy.就是判定一个数是否 ...

  4. 学会Git玩转Github笔记(三)—— Github Pages 搭建个人网站

    https://help.github.com/categories/github-pages-basics/ 一.个人站点 访问 https://用户名.github.io 搭建步骤 1) 创建个人 ...

  5. Python-PyQt4学习资料汇总

    摘自:http://www.cnblogs.com/coderzh/archive/2009/06/28/1512654.html 官方文档: http://pyqt.sourceforge.net/ ...

  6. 关于同一线程两次调用EnterCriticalSection的测试

    #include "stdafx.h" #include <iostream> using namespace std; #include <windows.h& ...

  7. Android推送方案

    一. 常见的推送原理: 1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等.而且你还要考虑轮询的频率,如果太慢可能 ...

  8. 代码收藏系列--jquery--筛选器、事件绑定技巧(转载)

    代码收藏系列--jquery--筛选器.事件绑定技巧 Jquery筛选器的一些常用技巧,比如过滤属性等 /* 过滤获取没有含data-xsui-grid-colspan的节点 */$(this).fi ...

  9. FastDFS这种架构,如何配置?

    FastDFS这种架构,如何配置?才能让欧洲用户可以就近下载Storage Server1的文件,而不是到中国的Storage Server 2下载?

  10. Redis-ha(sentinel)

    redis的sendtinel 是用来管理多个redis服务器的 作用 • 监控:监控主从服务器是否运作正常(通过给服务器发送心跳包的方式)    • 提醒:当某个Redis服务器出现异常时,可以通过 ...