欢迎投稿

今日深度:

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

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

解决办法:一次性导入大量数据时为了提高性能,可以使用 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 命令。

  1. 走近数据库前沿技术——集群
  2. Oracle数据库编写有效事务指导方针
  3. 基于JMX监控下的JBoss数据库连接池


www.htsjk.Com true http://www.htsjk.com/shujukujc/19143.html NewsArticle 在一次性导入大量数据到表中时,会因为写日志而影响性能,如何提高该操作的性能,在导入数据后,需要做更新统计操作,如何做 ? 解决办法: 一次性...
评论暂时关闭