IBM® DB2® Express-C 最近新增了几个重要的特性和改进,这些特性原先只存在于 DB2 for Linux®, UNIX®, and Windows® 的收费版中。本文学习如何利用性能、应用程序开发、存储、安全等方面的新功能。

Raul F. Chong, DB2 校园项目经理, IBM

Raul Chong 的照片Raul F. Chong 是 DB2 校园项目经理,也是加拿大多伦多实验的 DB2 技术专员,主要职责是扩展世界各地的 DB2 社区。他也是 IBM 多伦多实验室数据库顾问,还是一名 DB2 认证的解决方案专家(在管理和应用程序开发方面)。Raul 从 1997 年开始在 IBM 担任过很多职务,他还是 Understanding DB2 - Learning Visually with Examples(第二版)(ISBN-10: 0131580183)的主要作者。


developerWorks 投稿作者

2011 年 5 月 23 日 (最初于 2010 年 6 月 10 日)

免费下载:IBM® DB2® Express-C 9.7.2 免费版 或者 DB2® 9.7 for Linux®, UNIX®, and Windows® 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

简介

DB2 Express-C 是 DB2 的社区版本。可以把它作为生产系统的一部分使用,将其嵌入和部署到应用程序中,或者只是使用它进行开发。所有这些都是免费的!此图是获取 DB2 Express-C 9.7.4 免费数据库下载的链接

尽管 DB2 Express–C 只能使用两个核和 2G 内存,但是可以在任意大小的服务器上安装它,而且在数据库的大小方面没有任何限制。与其他厂商提供的数据库程序社区版本相比,DB2 Express-C 提供的功能是相当慷慨的。

自 2009 年 6 月 DB2 Express-C Version 9.7 发布到现在,DB2 Express-C 映像已经更新了三次。最新版 9.7.4 在 2011 年 5 月 2 日发布。本文概述在 9.7 版和最新的 9.7.4 版之间新增的一些重要特性和增强功能。对于 9.7 版以及更新映像中所有新功能的完整介绍,请参考 IBM DB2 Database for Linux, UNIX, and Windows 信息中心中的 Overview 主题。

请随意测试本文提供的示例。除非另有声明,示例都使用 DB2 中包含的 SAMPLE 数据库。注意,在把 DB2 Express-C 代码更新为新版本时,需要使用 db2updv97 命令更新现有的数据库。例如,假设您在最初安装 DB2 Express-C 9.7.1 时创建了 SAMPLE 数据库。现在,您希望使用 SAMPLE 数据库并利用 DB2 Express-C 9.7.4 中的新特性,那么需要运行:db2updv97 -d sample

这个命令在现有的数据库上启用新版本包含的新功能或特性。如果在更新 DB2 Express-C 代码之后创建新数据库,这些数据库会自动地启用最新特性,所以不需要运行此命令。

锁定增强

有了 Cursor Stability (CS) 隔离级别新的当前已落实(Currently Committed,CC) 语义,Writer(UPDATE 操作)不再阻塞 reader(SELECT 操作)。Reader 现在会读取在执行 UPDATE 操作之前提交的值。此增强功能会提高并发性并减少死锁。

假设有一个名为 T1 的表,其中有以下内容:

表 1. 表 T1 的内容
FIRSTNAME LASTNAME
Raul Chong
Jin Xie

现在,假设名为 AppA 的应用程序发出以下语句,但是没有执行提交:

update T1 set lastname = 'Smith' where firstname = 'Raul'

接下来,名为 AppB 的应用程序发出以下语句:

select lastname from T1 where firstname = 'Raul' with CS

在 DB2 9.7 之前,AppB 发出的语句会被挂起,因为它要等待释放 AppA(writer)的 update 语句持有的排他锁。如果启用这个新的 CS 行为(在新的 DB2 9.7 数据库中这是默认行为),AppB 发出的语句返回当前提交的值,而不需要等待。在这里,返回的值应该是 Chong,因为 AppA 发出的更新尚未提交。


性能增强

DB2 9.7 引入了语句集中器特性,提高了使用动态 SQL 以及 Ruby 和 PHP 语言开发的程序的性能。语句集中器寻找除参数值之外完全相同的 SQL 语句。顾名思义,它将多个语句合并为一个。例如,语句集中器将以下语句:

SELECT name FROM employee WHERE empid = 10
SELECT name FROM employee WHERE empid = 20
SELECT name FROM employee WHERE empid = 30

合并为:

SELECT name FROM employee WHERE empid = ?

问号(?)代表参数标记。在这个例子中,DB2 在运行时提供参数值 102030

此功能使 DB2 较之前的版本性能有显著的提升。由于没有语句集中器,DB2 之前的版本需要单独处理上面例子中的每个语句,单独编译和执行每个语句。然而,每个语句的访问计划基本相同,重复的计算是一种资源浪费。现在有了语句集中器特性,DB2 9.7 只编译一次语句就可获得访问计划,然后重用它即可。

另一个性能增强与大型对象(LOB)的存储有关。现在能够在数据行内存储小于指定大小的 LOB。这提高了这些 LOB 的性能,因为可以通过缓冲区池对其进行访问。


应用程序开发增强

DB2 9.7 包括针对应用程序开发人员的以下改进:

  • 触发器和用户定义函数(UDF)增加了 SQL PL 支持。在 DB2 9.7 之前,它们仅支持内联 SQL PL,这只是 SQL PL 的一个小子集。另外,触发器现在可以在单一子句中同时包含 UPDATE、DELETE 和 INSERT 操作,作为一个触发器事件。例如:
    CREATE TABLE COMPANY_STATS (NBEMP INTEGER)
    !
    
    CREATE TRIGGER HIRED
     AFTER INSERT OR DELETE OR UPDATE OF SALARY ON EMPLOYEE
     REFERENCING NEW AS N OLD AS O FOR EACH ROW
       BEGIN
             IF INSERTING
             THEN UPDATE COMPANY_STATS SET NBEMP = NBEMP + 1;
             END IF;
     
             IF DELETING
             THEN UPDATE COMPANY_STATS SET NBEMP = NBEMP - 1;
             END IF;
    
             IF (UPDATING AND (N.SALARY > 1.1 * O.SALARY))
             THEN SIGNAL SQLSTATE '75000' SET MESSAGE_TEXT='Salary increase>10%';
             END IF;
       END
    !

    在之前的版本中,必须为每个触发器事件创建单独的触发器。另外注意,这个示例中的 INSERTING、DELETING 和 UPDATING 是特殊的谓词,可以使用它们作为识别触发器操作的布尔条件。另外,BEFORE 触发器现在可以包含 UPDATE、DELETE、INSERT 和修改数据的例程。在之前的版本中,这只适用于 AFTER 触发器。
  • 对于 SQL PL 存储过程和 UDF,可以指定默认参数值并按名称分配参数值。此外,现在还支持新的布尔、游标、行和数组数据类型。
  • 现在支持用于快速删除的 TRUNCATE SQL 语句。
  • 现在支持 LISTAGG 聚合函数。顾名思义,这个函数按 WITHIN GROUP 子句指定的次序聚合一组字符串,从而创建列表。例如,假设连接 SAMPLE 数据库并执行以下语句:
       SELECT 
          workdept, 
          LISTAGG(lastname, ', ') WITHIN GROUP (ORDER BY lastname)
          FROM emp 
          GROUP BY workdept

    在此示例中,按字母表次序返回 workdept 列和由逗号分隔的姓氏列表:
    A00   HAAS, HEMMINGER, LUCCHESSI, O'CONNELL, ORLANDO
    B01   THOMPSON
    C01   KWAN, NATZ, NICHOLLS, QUINTANA
    D11   ADAMSON, BROWN, JOHN, JONES, LUTZ, PIANKA, SCOUTTEN, STERN, WALKER, YAMAMOTO, 
          YOSHIMURA
    D21   JEFFERSON, JOHNSON, MARINO, MONTEVERDE, PEREZ, PULASKI, SMITH
    E01   GEYER
    E11   HENDERSON, PARKER, SCHNEIDER, SCHWARTZ, SETRIGHT, SMITH, SPRINGER
    E21   ALONZO, GOUNOT, LEE, MEHTA, SPENSER, WONG
  • 现在支持其他的 SQL 语法,例如可以使用 ROWNUMROWID
  • DB2 9.7 现在支持模块概念(这与 Oracle 中的 “包” 概念相似)。可以使用模块把相关的数据库对象定义打包在一起。
  • DB2 9.7 现在支持隐式的数据类型强制转换。这对于 PHP 和 Ruby 这类动态语言很有帮助。例如,现在允许以下操作:
    create table t1 (col1 int)
    select * from t1 where col1 = '42'

    在这个例子中,现在可以将字符串值 42 与整数列 col1 进行比较。
  • 有许多用于处理日期、字符串和其他类型的数据的新函数。
  • DB2 现在支持 Create Global Temporary Table (CGTT),这是临时数据表,仅在会话期间可用。CGTT 与 Declared Global Temporary Table (DGTT) 之间的差异在于,对于 CGTT,DB2 编目表中保留表定义。因此,一旦创建了一个 CGTT,它可由任何会话使用,没有必要再次创建它。但是,每个会话的行是独立的。
  • 现在可以使用公共别名(也称为公共同义词)引用全局对象。在 DB2 9.7 之前,所有 DB2 对象都有一个惟一的名称,名称由两部分组成,第一部分是模式名,第二部分是对象名。通过创建公共同义词,可以不带模式名地引用对象,不管连接到数据库的用户 ID 是什么。例如:
    connect to sample user arfchong using mypsw
    create public synonym raul for table arfchong.staff
    select * from raul                                 ## works OK
    select * from arfchong.raul                        ## Error
    connect to sample user db2admin using psw
    select * from raul                                 ## works OK
  • DB2 9.7 放宽了对象依赖规则,允许更灵活的模式演化。例如,假设有以下依赖性:

    View2 --> View1 --> Table1

    以前,如果想要改变 View1,就必须删除 View2,因为 View2 依赖于 View1。但是在 DB2 9.7 中,没必要删除 View2。现在,DB2 立即自动执行对 View2 的重新检验,或者在下次使用此视图时执行,这在测试应用程序或需要改变数据库模式(例如增加列)时很有用。

    模式演化方面的一些其他改进包括:

    • 可以重命名列。
    • 在多个 CREATE 语句中添加了 REPLACE 选项,因而无需执行 drop 语句。因此,对象上的所有权限仍然保留。
    • ALTER COLUMN 现在可以对所有数据类型使用 SET DATA TYPE
  • Visual Studio 插件以及 IBM Data Server Provider for .NET 也得到了增强。目前这个提供程序支持主机变量、模块、ARRAY 数据类型、复合语句和可变长度时间戳。

    IBM Data Server Provider for .NET 的 32 位版本包含在 64 位驱动程序包中。在安装 64 位驱动程序时,32 位驱动程序也安装在名为 sqllib\bin\netf20_32 的另一个目录中。

    还有一个新的 db2dsdriver.cfg 文件关键字 QueryTimeout,它定义客户机在超时之前应该等待查询多长时间。

    其他增强包括 CALL 语句能够以任意次序接受有名称的参数。

  • 为了支持前面提到的其他增强功能,对 JDBC 和 SQLJ 进行了增强。
  • 现在支持具有精确到小数部分的秒设置的新数据类型,如 NUMBERVARCHAR2TIMESTAMP
  • 还改进了对 Python-DB2 应用程序的支持。
  • pureXML 增强包括对 Declared Global Temporary Table 的支持。
  • 现在支持使用 LIMITOFFSET 子句的新 SQL 语法。想要限制一个 SQL 语句返回的记录数,可以使用 LIMIT 子句。例如,如果 USERS 表有 100 条记录,但是只想返回其中 5 条,可以使用以下语句:
    SELECT * FROM users LIMIT 5

    OFFSET 子句指定从第一行起跳过多少行后开始返回结果。例如,如果要返回 USERS 表的第 11 行到第 15 行,可以使用以下语句:

    SELECT * FROM users LIMIT 5 OFFSET 10

    如果想直接从数据库获得滚动的多页面结果,而不是在应用程序层中筛选结果,这两个子句很有帮助。

    LIMITOFFSET 子句默认启用。但是,如果发现这两个子句无效,可以通过执行以下命令启用它们:

    $ db2set DB2_COMPATIBILITY_VECTOR=MYS
    $ db2stop
    $ db2start
  • 有一个新的 CONNECT_PROC 数据库配置参数,可以把它设置为存储过程的名称。在连接数据库时,会自动地调用这个过程,因此可以使用它在一个集中的位置配置连接参数。例如,这个过程可以设置特殊寄存器(比如 CURRENT_PATH、CURRENT_SCHEMA 和 CURRENT LOCALE LC_TIME)和全局变量,而不需要修改应用程序。
  • LIKE 谓词有一个新特性,允许使用列引用作为模式表达式。因此,可以使用 LIKE 谓词作为模糊联结谓词。例如,在使用 INNER JOIN 时,比较不同表的两个列,检查它们是否相等。现在,可以根据 LIKE 谓词进行模糊检查,而不是检查是否相等。假设有以下两个表:
COMPANY
NAMEPHONE
ACME416-123-1111
SOMOS905-122-9999
ZZZ713-999-8888
XLS647-123-9999
TELX416-590-1224
PHONECODES
CityAREACODE
Toronto416
Mississauga905
Oshawa647
Houston713
  • 现在,假设希望根据每家公司的电话区号找到它们所在的城市。在这种情况下,可以运行下面这样的查询:
      SELECT A.name, B.city 
         FROM company A, phonecodes B 
         WHERE B.areacode LIKE substr(A.phone,1,3)

    在这个查询中,LIKE 谓词在 PHONECODES 表的 AREACODE 列与 COMPANY 表的 PHONE 列的前三个字符之间执行模糊联结。结果是:
     NAME       CITY
    ---------- ---------------
    ACME       Toronto
    TELX       Toronto
    SOMOS      Mississauga
    XLS        Oshawa
    ZZZ        Houston

恢复和存储增强

“DB2 能存储多少数据?” 是当前和潜在的 DB2 用户经常问的问题。在每个新版本中,IBM DB2 开发团队都一直在突破极限。对于 DB2 9.7,大型表空间和临时表空间的大小限制增加了 4 倍。例如,页面大小为 32KB 的表空间现在可以存储 64TB,而在此之前只能存储 16TB。

有一个名为 db2cklog 的新工具。在使用存档日志文件执行前滚恢复之前,可以使用它检查这些文件的有效性。可以输入下面这样的命令来运行此工具:

db2cklog 2

其中的 2 是指第二个日志,其文件名是 S0000002.LOG


安全增强

在 DB2 的早期版本中,系统管理员有权访问所有内容。在 DB2 9.7 中,安全模型已经增强,允许职责分离。这使得数据暴露的风险最小化,同时也帮助组织满足政府的遵从性需求。有几个新的管理权限级别,其中两个是 DATAACCESSACCESSCTRL,分别用来给予用户访问数据的权限或授权别人访问数据的权限。这意味着,安全管理员可以撤消系统管理员或数据库管理员的这些权限级别,从根本上使他们无权访问任何数据。

还有审计方面的改进,允许重放以前的数据库活动。例如,想要分析几年前的某个请求如何影响一些表,可以使用数据库审计信息获取所需的分析报告。


可管理性增强

DB2 现在提供把表在线移动到另一个表空间的功能。这意味着,即使是在用户访问表的同时,也可以改变表的存储位置。这个例子也说明了 DB2 如何力求提供 24x7 数据可用性。当 DBA 检测到表空间之一的存储空间即将填满时,他或她可以使用 DB2 9.7 提供的 ADMIN_MOVE_TABLE 存储过程将其中的表移动到另一个有空闲空间的表空间。用户一点儿都不受影响;他们照样可以执行 SELECTINSERTUPDATEDELETE。为了实现这个功能,DB2 会创建表的影子拷贝并记录对原表所做的更改。以后,把这些更改应用到影子拷贝上。

可管理性方面的其他改进与传输数据库模式有关。可以把 DB2 中的 SQL 模式看作不同数据库对象(比如表、视图、索引等)的分组方式。例如,假设表 RFCHONG.T1 和视图 RFCHONG.V1 使用同一个名为 RFCHONG 的模式。有时候可能想要把使用同一模式的所有对象传输到另一个数据库。一种方法是使用 db2move 实用程序,这只适用于表。可以使用带 TRANSPORT 选项的 RESTORE 命令,从数据库备份映像中把表空间和 SQL 模式整体复制到另一个活动的数据库中。


安装增强

现在,可以使用 DB2 拷贝检验工具命令 db2val 来快速检验 DB2 Express-C 的安装是否正确。

用于 Linux 和 Windows 的 DB2 Express-C 映像的资源占用量已经显著降低了(高达 37%)。还可以在 Amazon Cloud 和 IBM Cloud 上使用 DB2 Express-C 映像,Rightscale 中的几个模板也包含 DB2 Express-C 映像(参见 参考资料 中 Amazon Cloud、IBM Cloud 和 Rightscale 的链接)。


DB2 Spatial Extender 和 Text Search

尽管 DB2 的空间功能出现已经将近十年了,但是很多用户并不了解它。尽管这个功能并不是 9.7 更新映像中新增的,但值得一提的是,Spatial Extender 在所有 DB2 版本(包括 DB2 Express-C)中都是免费的。Spatial Extender 允许使用 SQL 语句处理空间数据和地理测量数据。例如,该功能可以帮助回答这类问题:“对于住在多伦多而且去年消费额超过 $3000 的用户来说,最近的零售商店是哪一家?”

DB2 Spatial Extender 也可用于医疗行业。例如,它可以回答 “在 MRI 脑部扫描中恶性肿瘤细胞是什么形状?” 这类问题。

欲了解更多信息,请参考 IBM DB2 Database for Linux, UNIX, and Windows 信息中心中的 About DB2 Spatial Extender 主题。

在 DB2 Express-C 9.5.2 中,Text Search 已经与 DB2 产品集成,它允许用户对文本列执行快速搜索。在 DB2 Express-C 9.7.4 中,进一步改进了性能、配置和调优。欲了解关于 Text Search 的更多信息,请参考 “参考资料” 中的文章 Discover new features in DB2 Express-C 9.5.2


结束语

本文着重介绍了从 DB2 Express-C 9.7 版本到目前的 9.7.4 更新版引入的比较值得注意的增强功能。IBM 的 DB2 免费社区版本的最新版包括与性能、应用程序开发、存储、安全等相关的新功能,其中一些功能以前仅在 DB2 收费版中可用。

尽情享受新的 DB2 Express-C 9.7.4 吧!

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=498936
ArticleTitle=DB2 Express-C 9.7.4 新增特性
publish-date=05232011