DB2数据库移植常见问题全面解析(四)

日期: 2009-01-22 作者:Anna 来源:TechTarget中国 英文

在一次性导入大量数据到表中时,会因为写日志而影响性能,如何提高该操作的性能,在导入数据后,需要做更新统计操作,如何做?

解决办法:一次性导入大量数据时为了提高性能,可以使用alter table activate not logged initially在该事务中关闭该表的日志选项,然后执行数据导入,在该事务结束后,该表日志开关自动打开。在导入大量数据后,为了提高查询性能,再运行runstats on table命令更新查询统计信息。
提示:必须在一个事务中执行关闭日志和数据导入才会不记日志,当前事务结束后日志开关会自动重新打开。

DB2中如何定时执行一些任务,如表的清空等维护操作?

解决办法:在任务中心图形界面中将维护脚本导入,并设定定时调度的时间周期,任务中心会自动调度该任务。运行任务中心的前提是数据库服务器上已装有任务中心,并已编目工具目录数据库,如果没有工具目录数据库,请按以下步骤操作:

a.使用create db taskdb创建一个新的数据库,以用于工具目录数据库;

b.使用 db2admin start 启动数据库管理服务器,如果已经启动,进入第三步;

c.使用 db2 create tools catalog toolscat use existing db taskdb 编目工具目录数据库。

DB2中如何实现为一个 DMS 表空间自动添加容器的脚本?

解决办法:可以先计算表空间当前可用大小,如小于某个设定值,则用 Alter tablespace add (…) 语句添加新的容器到表空间。计算表空间可用大小的方法可以参照问题“如何用sql语句获取表空间的当前使用率?”

用UDF实现了将TimeStamp类型的一个变量转换成Date型,但却无法将该UDF用于Group By子句

解决办法:可以使用 With 语句将需要 Group By 的字段先预先处理。如:with t1(col1) as (select func1(timecolumn) from t2) select col1 from t1 group by col1。With 语句中的 func1()为 UDF,实现了将 timestamp 转换为 date 的功能,其结果通过 with 语句被定义为一个 t1 中的虚列 col1,然后在 t1 中按 col1 分组。注意上面是一条语句,中间没有分隔符。

如何做类型转换才能将VARGRAPHIC类型的数据用在LOCATE函数中?

解决办法:先将 VARGRAPHIC 转换成 VARCHAR。然后再用于 locate 函数。

原因分析:LOCATE 函数只能接受字符串作为输入,所以必须将 VARGRAPHIC 先转换成 VARCHAR。同时在数据库编码格式上有要求,只有用 Unicode codepage 创建的数据库才能实现 VARGRAPHIC 到 VARCHAR 的转换。所以之前要用 UTF-8 CN_ZH 方式创建数据库。

如何使用DB2 JDBC TYPE 4方式连接数据库?

解决办法:将 JDBC Driver 配置为 com.ibm.db2.jcc.DB2Driver,在程序中数据库 URL 指定为 jdbc:db2://server:port/alias。Server 是指数据库服务器所在主机名或 IP;port 是数据库服务端口号,缺省是 50000;alias 是数据库别名。编译时需要 db2jcc.jar,记得把它指定在 classpath 中。

如何将一个timestamp类型转换为yyyymmdd格式?

解决办法:可以使用用户自定义函数(UDF)来实现。以下是一个广为流传的转换函数代码:

清单10. 将timestamp类型转换为yyyymmdd格式


create function ts_fmt(TS timestamp, fmt varchar(20))
returns varchar(50)
return
with tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as
(
select
substr( digits (day(TS)),9),
substr( digits (month(TS)),9) ,
rtrim(char(year(TS))) ,
substr( digits (hour(TS)),9),
substr( digits (minute(TS)),9),
substr( digits (second(TS)),9),
rtrim(char(microsecond(TS)))
from sysibm.sysdummy1
)
select
case fmt
when ‘yyyymmdd’
then yyyy || mm || dd
when ‘mm/dd/yyyy’
then mm || ‘/’ || dd || ‘/’ || yyyy 
when ‘yyyy/dd/mm hh:mi:ss’
then yyyy || ‘/’ || mm || ‘/’ || dd || ‘ ‘ ||
hh || ‘:’ || mi || ‘:’ || ss
when ‘nnnnnn’
then nnnnnn
else
‘date format ‘ || coalesce(fmt,’ ‘) ||
‘ not recognized.’
end
from tmp@

将上述代码保存在一个文本文件中,假设保存到 func.db2 中,使用以下命令创建函数:db2 –td@ -f func.db2。然后即可使用该 UDF 进行时间格式转换。该函数可以根据输入的 timestamp 转换为多种格式,包括 yyyymmdd,mm/dd/yyyy,yyyy/dd/mm hh:mi:ss,或者返回毫秒数(nnnnnn)。

在SQL存储过程中有(‘每月’||COALESCE(VAR, ”)||’元’)语句时,编译无法通过

解决办法:客户端 codepage 和脚本的编码格式不同,所以服务器端无法识别脚本命令,把客户端codepage设为1386即可。

Oracle中有一个函数DBMS_SQL.VARCHAR2_TABLE,可以传入一个以某个分隔符为分隔的字符串,该函数将该字符串以分隔符拆分,返回给调用者一个数组或是表,DB2 中如何实现类似功能?

解决办法:用全局临时表实现;

原因分析:Oracle 中的 varchar2_table 其实是集合的概念,在 DB2 中不支持集合。DB2 通常做法是声明全局临时表(DGTT),第一列存储记录顺序,第二列存储数据。以下是示例,在声明后即可向该表中插入和查询数据,效果和集合相同。

清单 11. 实现拆分


DECLARE GLOBAL TEMPORARY TABLE SESSION.temp_emp_list
(num integer, EmpName varchar(30))
WITH REPLACE
ON COMMIT PRESERVE ROWS NOT LOGGED;

DB2无法对允许空值的列建唯一性索引

解决办法:将该列属性设为不允许为空;

原因分析:空值在数据库中被认为是不确定值,任何其他值与空值组合,结果仍然是空值,不具备唯一性,所以 DB2 不允许空值列作为唯一键的索引列。

同一张表的索引可以放在不同表空间中吗?

解决办法:在创建表的时候使用 INDEX in tablespace-name 选项,在该表上创建的索引将存放在指定的表空间上;

原因分析:表数据,表索引,以及表中的 long 型数据可以分开存放在不同的表空间。可以提高性能。

用UDF调用存储过程总是编译通不过,报关键字冲突错误

解决办法:把该UDF改造成存储过程;

原因分析:DB2中UDF主要用于逻辑运算和处理,存储过程则偏重于处理数据库对象,如表数据的增删查改,所以两者的用途不同决定了其使用方式也不同,UDF 使用的是内嵌的 SQL 语句,是 SQL 语言的子集,不能执行动态 SQL,如果 UDF 调用存储过程,则会导致 SQL 嵌套上的混乱,因为 UDF 通过调用存储过程实现了 SQL 全集,这是不允许的,所以报关键字冲突,把该 UDF 改为存储过程即可。

建议对于不涉及数据库表操作的业务逻辑可以用 UDF 实现,如逻辑算法,文件操作,系统调用等,而涉及到数据库表操作的功能则交给存储过程来实现。存储过程可以调用 UDF。

工具使用

如何在CLP中查看表结构

解决办法:使用 db2 describe table 命令。

用开发中心远程调试存储过程,可以构建,但构建并调试却不能成功

解决办法:在远程数据库上安装 DB2 开发包;

原因分析:在远程调试时将会调用远程数据库上的开发包,所以远程服务器一定要装有开发包才可远程调试。

如何将部署在 DB2 数据库上的存储过程导出为可执行脚本,以便在其它机器上部署

解决办法:在开发中心中可以导出存储过程为脚本,前提是之前创建存储过程的时候没有指定 hide body。

如何让DB2自动运行runstat

解决办法:使用db2 update db cfg using auto_runstats on命令。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐

  • BMC公司z/OS DB2数据库性能工具 不只是便捷

    BMC公司z/OS DB2数据库性能工具可以用来监控和管理多套DB2系统的关键性能特征,只需要在一套平台上就可以完成监控工作。

  • 数据库产品巡礼:IBM DB2概览

    IBM DB2关系型数据库管理系统提供了支持多平台系统的关键技术,它具备较高的可用性和良好的性能。

  • 如何进行分布式大数据应用调优

    分布式环境通常是与数据库服务器相分离的。而DBA的工作就是监视这些环境并配置和优化数据库服务器以满足多种需求。大数据的出现加剧了DBA的问题。

  • IBM DB2将迎来30岁“生日”

    再过几天,主流数据库产品DB2就将迎来它30岁的“生日”。作为关系型数据库技术的标志性产品,DB2在过去的30年中也在伴随用户需求的变化不断地发展。