上一篇 | 下一篇

请考虑版本 8 中的 Sequence 对象

发布: 2008-7-01 13:42 | 作者: admin | 来源: | 查看: 0次

请考虑版本 8 中的 Sequence 对象

热 荐

【字体:小 大】

请考虑版本 8 中的 Sequence 对象

作者:- 文章来源:- 点击数:1537 更新时间:2006-4-22

Susan Lawson

摘自 IDUG Journal,

2004 年 4 月 现在,我想要简要地来介绍一下 Sequence 对象以及如何用它们来代替 Identity 列。我们还将介绍版本 8 中一些用以使用 Identity 列的新功能。

我的上两个专栏中已经介绍到了与版本 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

字号: | 推荐给好友

41/41234>

评分:0

我来说两句