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

 
   | |

导读:本文是对DB2数据库移植常见问题中的数据导入问题的解决办法的介绍。包括在一次性导入数据到表中时而影响性能以及如何提高性能等方面的内容。

关键词:DB2 DB2数据库 数据库移植 DB2常见问题分析

正在加载数据...

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

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


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

原文出处:http://tech.ccidnet.com/art/19213/20080630/1492051_2.html
 
来源:赛迪网    作者:Anna     
 
 
 
 
 

DB2安装与升级

 
夏洛特的可口可乐装瓶工厂是全美第二大的,他们已经将22个SAP系统迁移到DB2数据库上了,还有10个左右的Oracle数据库还在使用。

热门技术手册排行

 

在本次的技术手册中,我们为您提供了PL/SQL的基础知识以及专家指导,包括了PL/SQL中的数据类型简介、PL/SQL函数与触发器以及PL/SQL中的存储过程等,相信您无论是高手还是菜鸟都可以获得有帮助的信息。

 

本系列文章由三部分组成,为Oracle数据库管理员(DBA)面试成功的必备手册。本专题内容囊括从DBA最初的面试开始,从写“杀手简历”到求职信、到面试过程到Oracle认证再到上升到公司高层最后到你成为公司里的明星DBA。专家为你一一指点迷津,最终让你登上成功的宝座。

 

要成为一名DBA,你需要具备哪些素质?DBA的薪酬待遇如何?DBA的职业道路究竟可以走向何方?我们将在本次的技术手册中为您一一解答。

 

在本次技术手册中,我们将对SQL Server存储过程的调试进行详细的介绍,包括了基础的调试方法和在调试过程中出现的T-SQL性能问题和解决方法。

 

本技术专题主要围绕sql server设计这个话题展开,侧重介绍了sql server集簇索引的设计、如何创建sql server索引、如何优化索引、索引的能与不能、处理sql server 2000索引碎片技巧以及维护sql server索引以实现查询优化等等。

查看更多
 
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录