【51CTO独家特稿】首先声明一点,本文不是DB2 9.7新特性的详尽清单,我仅仅列出了针对DBA或开发人员非常重要的清单。
联机方案修改
请看Burt关于联机方案修改的文章,地址:http://www.ibm.com/developerworks/data/library/techarticle/dm-0907db2outages/index.html。
CGTT – 创建全局临时表
现在可以创建全局临时表,再也不用在每次会话中声明临时表了,全局临时表有以下几个好处:
1、CGTT根据授权控制
2、可以在CGTT上定义视图,索引和触发器
3、CGTT和DGTT可以包括LOB数据类型
- CREATE GLOBAL TEMPORARY TABLE DGTT_TABLE
- (
- EMP_ID INTEGER,
- HIRE_DATE TIMESTAMP(3)
- )
参数标记
存储过程中的参数可以有默认值。
在调用语句中,你可以直接使用默认值,跳过参数的赋值。
命名参数允许按名称,以任何顺序赋值。
DB2中的SSL连接
DB2允许在Java客户端和服务器之间使用SSL连接,但需要同时对客户端和服务器进行配置才能正常使用。
服务器端配置
使用iKeyman GUI工具创建一个证书数据库,即KeyStore文件;
将你从证书颁发机构购买的服务器数字证书导入到证书数据库;
设置下面的DBM配置参数;
◆ SSL_SVR_KEYDB:密钥存储文件
◆ SSL_SVR_STASH:Stash文件
◆ SSL_SVCENAME:SSL端口
另外,选择一个密码套件
◆ SSL_CIPHERSPECS:允许的加密套件
◆ SSL_VERSIONS:允许的SSL/TLS版本
开启实例SSL通信功能
db2set DB2COMM=SSL或db2set DB2COMM=SSL,TCPIP
客户端配置
使用ikeyman GUI工具创建一个签名证书数据库;
将你从证书颁发机构购买的服务器数字证书导入到证书数据库。
修改连接属性
- ....
- properties.put("sslConnection", "true");
- System.setProperty("javax.net.ssl.trustStore", "/home/db2inst1/client.jks");
- System.setProperty("javax.net.ssl.trustStorePassword", "myPassword");
- ....
- con = java.sql.DriverManager.getConnection(url, properties);
SSL握手是如何工作的?
客户端请求一个SSL连接,列出它的SSL版本和支持的加密套件;
服务器使用一个选定的加密套件进行响应;
服务器将它的数字证书发给客户端;
客户端验证服务器的证书(服务器验证);
客户端和服务器安全地协商一个会话密钥;
客户端和服务器使用前面选定的密钥安全地交换信息。
XML增强
在XML处理方面有一些增强,值得关注的是:
对pureXML的完整支持;
XDA对象中的XML文档也可以压缩;
XML索引在线重组;
UDF中可以使用XML列;
MDC表中可以使用XML列;
来自查询CLP命令的DECOMP:为了拆分XML文档,可以使用DECOMPOSE XML DOCUMENTS IN <select_statement> XMLSCHEMA <xmlschemaname>;
来自查询存储过程的DECOMP:sysproc.xdb_Decomp_XML_From_Query;
ADMIN_IS_INLINED和ADMIN_EST_INLINE_LENGTH可以用于了解XML或LOB是否内联或其长度。
DECOMP示例:
- DECOMPOSE XMDOCUMENTS IN
- 'SELECT DOCID, SALESDOC
- FROM ABC.SALESTAB'
- XMLSCHEMA ABC.SALES
- MESSAGES /home/myid/errors/errorreport.xml
- CALXDB_DECOMP_XML_FROM_QUERY (
- 'ABC', 'SALES',
- 'SELECT DOCID, SALESDOC FROM ABC.SALESTAB',
- 0, 0, 0, NULL, NULL, 1,
- :hnumInput, :hnumDecomposed, :herrorreportBuf);
注意:XDA=存储XML文档,且在基础表中没有内联的对象。
CLPPLUS vs SQL*Plus
DB2有一个和Oracle的SQL*Plus类似的工具,叫做CLPPlus,如果你知道怎么用SQL*Plus,那你一定会用CLPPlus。
DB2中的PL/SQL
这个听起来似乎最能吸引人们的目光,试想一下你在DB2中使用Oracle PL/SQL的感觉,记住Oracle已经有20年的PL/SQL开发经验,因此与Oracle比起来还是有差距的,但相信IBM会越做越好。
DB2中的PL/SQL编译器是天生的,不是什么屏蔽层,不是将PL/SQL转换成DB2 SQL PL,因此可以在代码级调试PL/SQL。
支持的DBMS包:
DBMS_OUTPUT
UTL_FILE
DBMS_ALERT
DBMS_PIPE
DBMS_JOB
DBMS_LOB
DBMS_SQL
DBMS_UTILITY
UTL_MAIL
UTL_SMTP
支持的PL/SQL特性
所有语言逻辑支持,如IF, WHILE :=等;
异常 - Try/catch处理;
用户定义的异常;
常数变量 – 变量不能被设置;
单步调试查询结果集;
单步调试游标结果集;
%TYPE – 锚标数据类型;
%ROWTYPE – 锚标行类型;
BULK COLLECT/FETCH – 将结果集聚集到数组中;
FORALL – 将数组输入到SQL语句;
AUTOMONOUS事务 – 在一个独立的TX中执行一个存储过程;
匿名块;
标量函数;
存储过程;
包;
触发器;
包上的同义词。
DB2中的Oracle类型:
- NUMBER
- VARCHAR2 - NULL = '',尾部空白敏感整理
- TIMESTAMP(n) - 0 (date + time) <= N <= 12(日期+时间+皮秒)
- DATE – 年到秒,sysdate
- BOOLEAN
- INDEX BY
- VARRAY
- Row Type
- Ref Cursor – 允许传递和预定义游标
DB2中重要的Oracle函数部分清单
- TO_CHAR, TO_DATE, TO_TIMESTAMP, TO_NUMBER, TO_CLOB
- EXTRACT, ADD_MONTHS, ...
- INITCAP, RPAD, LPAD, INSTR, REVERSE, ...
- DECODE, NVL, LEAST, GREATEST, BITAND
- DB2中的Oracle SQL清单
- CONNECT BY
- (+)-join
- DUAL
- ROWNUM
- NEXTVAL/CURRVAL
- MINUS
- Unnamed inline views
- TRUNCATE table
- Public synonym
- CREATEd temp table
职责分离
SYSADM在DB2中当上帝的日子一去不复还了,现在各个角色的分工非常明确。
有了数据库级的SECADM后,赋予SYSADM的DBADM肯定会移除了;
SECADM现在可以被分配给ROLE和GROUP;
SECADM现在可以授予/取消数据库和对象认证;
DBADM可以按这种方式创建,因此它不能看到数据,也不能执行授权/撤销授权;
DBADM不能获得间接授予的权限;
创建了新的权限,如EXPLAIN, DATAACCESS, ACCESSCTRL, SQLADM, WLMADM。
自动存储
新增了一些自动化存储方面的功能,值得关注的是:
当现有存储路径被填满后,你可以在线增加一个存储路径,如果你想跨4个存储路径条带化数据以获得高并行能力,可以使用ALTER TABLESPACE myts REBALANCE命令重新平衡数据,另外还可以使用ALTER TABLESPACE myts REDUCE命令减小高水位标记;
你可以使用ALTER DATABASE DROP STORAGE PATH ON 'path1'删除一个存储路径,存储路径被修改成DROP PENDING状态,所有的表空间被标记为“基本存储路径已经被删除”,当所有使用它的表空间通过ALTER TABLESPACE ts1 REBALANCE重新平衡后,DROP PENDING存储路径被移除;
ALTER TABLESPACE ts1 REDUCE命令将会释放截留的空间,不允许高水位标记低于早前的DB2版本;
你可以将非自动化存储数据库转换成自动化存储数据库:
◆ALTER DATABASE ADD STORAGE支持非自动化存储数据库;
◆上面的命令给数据库增加一个存储池;
◆它允许使用自动化存储创建新的表空间。
你可以将非自动化存储DMS表空间转换成自动化存储表空间:
◆ALTER TABLESPACE … MANAGED BY AUTOMATIC STORAGE;
◆来自新存储路径的新增长被添加到数据库中;
◆旧容器可以使用DROP或REBLANCE移除。
使用自动化存储,可以从旧的DMS执行REDIRECTED RESTORE恢复到新表空。
在线表移动
在线表移动可以用于许多环境:
你想在线重组或重新分配时;
想做在线表压缩时;
在线改变页面尺寸;
在线转换到大表空间;
将数据/索引/长数据移动到新的/不同的表空间;
增加或移除列,修改列数据类型,扩充列;
增加/修改MDC尺寸,范围分区或分区键。
在线表迁移是通过系统存储过程ADMIN_MOVE_TABLE()完成的,这个存储过程允许将数据从现有表迁移到新表对象中,数据移动后,在源表上使用SELECT,INSERT,UPDATE和DELETE操作仍然有效。
这个存储过程分为4个步骤:
1、初始化
选择拷贝索引,创建触发器,创建目标和临时表。创建触发器的目的是捕获源表上的改变。
2、拷贝
一行一行地从源表拷贝到目标表中,也可以使用LOAD。
3、重放
重新从源表拷贝捕获到临时表中的行,可能需要多次往返重复的操作。
4、交换
用于交换的目标表已准备就绪,索引等已经创建完毕,源表为最后的重放以共享模式锁定,然后重命名源表,再将目标表重命名为源表名。
压缩MDC表
DB2中的MDC表有点特殊,通常如果没有删除操作,它一般不需要重组,删除操作让MDC表变得稀疏,如何回收那些未使用的页面回到表空间,以便让其它表可以使用?使用下面的命令即可:
- REORG TABLE mdctable RECLAIM EXTENTS ONLY
上面的命令效率非常高,因为它实际上没有进行重组,只不过在MDC表的块映射中将未使用的块标记成了未分配的。
内联LOB
通过内联LOB压缩空间,如:
- CREATE TABLE … EMP_PHOTO BLOB(10MB) INLINE LENGTH 20000;
- ALTER TABLE … ALTER COLUMN EMP_PHOTO SET INLINE LENGTH 20000;
LOB比内联长度超出的部分存储在LOB表空间上,但其它的将被单独内联存储,在表中可以有混合的内联或非内联LOB。
即使没有设置内联长度,DB2也可以内联LOB,当一个LOB的真实长度低于其描述符的长度时会发生。
局部范围分区索引
DB2在范围分区表上有一个全局索引,现在又多了一个局部范围分区索引,可以更快速地插入和检索数据。
- C:\>clpplus db2admin/password@localhost:50001/SAMPLE
- Database Connection Information
- Hostname = localhost
- Database server = DB2/NT SQL09070
- SQauthorization ID = db2admin
- Local database alias = SAMPLE
- Port = 50001
- CLPPlus: Version 1.0
- Copyright (c) 2009, IBM CORPORATION. All rights reserved.
- SQL> create tablespace tbsp1;
- DB250000I: The command completed successfully.
- SQL> create tablespace tbsp2;
- DB250000I: The command completed successfully.
- SQL> create tablespace tbsp3;
- DB250000I: The command completed successfully.
- SQL> create tablespace tbsp4;
- DB250000I: The command completed successfully.
- SQL> create tablespace tbsp5;
- DB250000I: The command completed successfully.
- SQL> create tablespace tbsp6;
- DB250000I: The command completed successfully.
- SQL> CREATE TABLE TAB1(c1 INT)
- 2 PARTITION BY RANGE (c1)
- 3 (STARTING FROM (1) ENDING (50) IN tbsp1 INDEX IN tbsp2,
- 4 ENDING(100) IN tbsp3 INDEX IN tbsp4,
- 5 ENDING(150) IN tbsp4 INDEX IN tbsp6);
- DB250000I: The command completed successfully.
- SQL> CREATE INDEX IDX1 ON TAB1(c1) PARTITIONED;
- DB250000I: The command completed successfully.
你可以执行分区级索引重组,分区级表重组,但RUNSTATS仍然是在表级运行的。
当你做一个ATTACH,需要的索引已经创建好,连接到主表的速度非常快,否则它会自动创建索引,DETACH会从主表中快速地取消分区链接,使其成为一个常规表。
新的当前提交隔离措施
它只是游标稳定性隔离的一个变种,记录程序不会阻止阅读程序,Oracle是基于快照实现的,而DB2是基于日志实现的。
新的CC隔离级别是新的默认隔离级别,代替了旧的CS隔离级别,DB2使用当前完全锁避开了当前提交隔离级别,因此从Oracle转移到DB2时不需要应用程序改变,CC是基于日志数据的,DB2首先去日志缓冲区查找数据,因为更新事务仍然是活动的,因此数据可能仍然呆在日志缓冲区中,否则就必须去查找磁盘上的日志文件,这种类型的锁不需要回滚段,但Oracle需要,因为DB2使用的是日志缓存区记录或磁盘上的日志文件。
语句浓缩器
你是否还记得Oracle使用CURSOR_SHARING=YES参数避免重复编译SQL语句吗?你是否还记得这个方法导致优化器生成非最优的执行计划让你头疼吗?由于其严重的性能问题,很多使用Oracle的人都特别痛恨这个功能,但DB2也实现了这个功能,不过可以在STATIC或DYNAMIC语句中使用REOPT参数避开非最优的执行计划。
临时表压缩
如果获得了深度压缩许可,临时表会自动压缩,不需要用户执行额外的操作。
索引压缩
你现在可以压缩DB2中的索引,只需要在CREATE INDEX或ALTER INDEX命令中追加COMPRESS YES参数即可。
查询压缩索引空间节省估算值
- SELECT index_name, pages_saved_percent, compress_attr, index_compressed
- FROM TABLE SYSPROC.ADMIN_GET_INDEX_COMPRESS_INFO
- ('T', 'myschema', 'T1', '', '')) AS T
压缩索引后究竟节省了多少空间?压缩完索引后,重新运行上面的查询得到真实的空间节省值。
- ALTER INDEX index1 COMPRESS YES
- REORG INDEXES ON TABLE t1
- RUNSTATS ON TABLE t1
原文出处:http://www.db2ude.com/?q=node/128
原文名:New Exciting Features in DB2 9.7
作者:Vikram Khatri
【编辑推荐】
【责任编辑:彭凡 TEL:(010)68476606】