Oracle迁移到DB2的策略及最佳案例

来源:互联网 发布:数据库like语句 编辑:程序博客网 时间:2024/05/18 00:06
本文讲解了从Oracle到DB2迁移的最佳解决方案,主要从三件事开始:

  一、某电信公司的转型故事

1、该电信公司数据仓库技术结构:

Oracle迁移到DB2的策略及最佳案例_新客网

· 省中心BOSS数据加载到DB2中央数据仓库中。

· 中央数据仓库生成地市所需要的中间结果或分析结果并加载到数据集市中。

· BI应用包括仓库应用和集市应用。

2、硬件结构

Oracle迁移到DB2的策略及最佳案例_新客网


3、“账户资费”仓库应用响应时间慢

1)数据库表适用情况

这个涉及100多张表,其中有30多张大表,记录数都在10亿条以上,而表中数据分布在32个DPF分区上。

2)适用PAT系统化方法优化

应用监控: I/O、CPU、网络和内存

配置检查:系统配置、DBM参数和DB参数。

涉及检查:罗技涉及和物理设计。

性能优化:针对性调整。

  4、PAT树 适用流行的优化工具

1)什么是PAT树

PAT:Problem Addressing Tree

根节点用来指明性能问题分类;非叶节点用来存放监控和诊断信息;叶子节点给出了具体的优化方法。

2)PAT方法学

PAT方法学是一种系统化的数据库性能诊断和优化方法。

  5、都是“热表”惹得祸

1)怎样监控到的?

通过编目表syscat.tables和sysibmadm.snaptab,发现了活跃程度最高的前N张表,我们拿这钱N章表中ACC_ITEM来说明。

Oracle迁移到DB2的策略及最佳案例_新客网

2)热表数据在32个分区分布极不均匀。

通过下面的语句发现表ACCA_ITEM在32个分区上数据分布极不均匀,下面是查找该表在 32 个节点上数据分布所使用的语句:

select DBPARTITIONNUM,SUM(DATA_OBJECT_L_SIZE) lszkb, 
SUM(DATA_OBJECT_P_SIZE),pszkb, SUM(INDEX_OBJECT_P_SIZE) iszkb 
from TABLE 
(SYSPROC.ADMIN_GET_TAB_INFO_V95(
'BI', 'DWD_ACC_OWE_ITEM')) AS T 
GROUP BY DBPARTITIONNUM 
ORDER BY DBPARTITIONNUM

3)表ACCA_ITEM的DDL定义

CREATE TABLE “BI”.”ACC_ITEM”(
“BILLING_CYCLE_ID” 
VARCHAR(6),
“BILL_DTL_ID” 
DECIMAL(15,0),
“DEFAULT_ACCT_ID”
DECIMAL(9,0),
“ACCT_ID” 
DECIMAL(9,0),
USER_ID DECIMAL(9,0),
“SVC_NUM” 
VARCHAR(64),
“AREA_ID” 
VARCHAR(3),

“ETL_TIME” 
TIMESTAMP,
“ETL_DATA_CYCLE” DATE)
DISTRIBUTE 
BY HASH(“USER_ID”)
INDEX IN “TBS_INDEX”
)

这里的USER_ID作为Hash Key。

  6、原来是Hash Key搞错了

1) 怎么找到原因的?

首先要和表设计人员沟通,通过元数据库调查表之间的血缘关系,然后追踪了数据流(ETL工具使用Datastage),发现很多记录的user_id值为0,而user_id为hash key。这使得数据被hash到有限的几个分区中。

2) 怎么解决的?

使用该表另外字段ACCT_ID作为Hash key,数据在分区间做重平衡操作。

  7、Oracle和DB2在这个案例上有什么不同?

1)Oracle和DB2导致的不同结果

Oracle:倾斜的大数据分区位于共享磁盘上。

DB2:倾斜的大数据分区位于DPF节点上。

2)DB2数据库分区有什么特点?

多个数据库分区在一起并行工作来处理工作负载,提供了强大的线性扩展能力,通常被广泛应用在数据仓库中。

8、Oracle和DB2支持的分区特性一览表

概念上相似,用法略有不同。另外也可以组合使用:

Oracle迁移到DB2的策略及最佳案例_新客网


  9、背后的深层次原因-转型问题

1) 电信公司

前期请了多加资讯公司做了可行性分析,对经营分析系统报以厚望,从上到下投入都很大。

2) 项目进度要求

时间紧,任务重。

3) 技术人员情况

刚从Oracle转型过来的,只接受过DB2入门级的培训,经验主义严重,不熟悉DB2设计技术,对使用DB2开发存在“恐惧”心理。

  二、从Oracle到DB2设计转型

  1、 术语对比

Oracle迁移到DB2的策略及最佳案例_新客网

  2、 产品和工具对比

Oracle迁移到DB2的策略及最佳案例_新客网


  3、 Oracle系统架构

1) Oracle System ID(非RAC架构)

Oracle迁移到DB2的策略及最佳案例_新客网

一个Oracle SID一次只能访问一个数据库,“Instance”指内存和访问数据的后台进程组成,“Database”指用于存储信息的物理文件。

  4、 DB2系统架构

Oracle迁移到DB2的策略及最佳案例_新客网

DB2服务器可以创建多个实例,每个实例可以同时访问多个数据库;每个实例中运行多个引擎派遣单元 Engine Dispachable Units(EDUs);每个实例有自己的配置(dbm cfg)。

5、 存储模型对比

Oracle迁移到DB2的策略及最佳案例_新客网

  6、 全局临时表:DB2功能更多

临时表不会被锁定,在插入、更新时不产生redo log,容易维护,通常用来保存操作的中间结果集来提升性能:

Oracle迁移到DB2的策略及最佳案例_新客网

  7、 视图:非常相似

Oracle和DB2视图功能相似,如下表所示:

Oracle迁移到DB2的策略及最佳案例_新客网


  8、 索引:难分仲伯

Oracle迁移到DB2的策略及最佳案例_新客网

  9、 序列:DB2更细腻

用法上相同,DB2还支持标识列:

Oracle迁移到DB2的策略及最佳案例_新客网

  10、约束:Oracle更灵活

区别见下表:

Oracle迁移到DB2的策略及最佳案例_新客网


  三、当Oracle开发者遇到DB2

  1、 数据库开发的难点

Oracle迁移到DB2的策略及最佳案例_新客网

1) 用户的选择。

第一,选择其中一种数据库并与之绑定;第二,支持两种或多种数据库并维护针对每种数据库的实现;第三,只是用各种数据库都支持的功能。

2) 上面的任何一种选择都不理想。

2、 DB2 V9.7的新思路

Oracle迁移到DB2的策略及最佳案例_新客网

内置地支持Oracle的语法,语义及相关工具:客户通过开关参数选择使用DB2还是Oracle语境,同意执行引擎保证PL/SQL和SQL PL有相同的性能。

  3、 DB2 9.7支持下面的Oracle功能

Oracle迁移到DB2的策略及最佳案例_新客网

只有极少情况下才需要更改。


  4、 并发控制比较

1) Oracle默认情况

语句级快照。

Oracle迁移到DB2的策略及最佳案例_新客网

2) DB2 V9.7之前默认情况

游标稳定隔离级别。

Oracle迁移到DB2的策略及最佳案例_新客网

3) DB2 V9.7目前默认情况

当前提交隔离级别。

Oracle迁移到DB2的策略及最佳案例_新客网

  5、 创建兼容Oracle的DB2数据库

Db2set DB2_COMPATIBILITY_VECTOR=ORA
Db2stop force
Db2start
Db2 “
CREATE DATABASE dbName AUTOMATIC STORAGE YES
ON <storagePath1> PAGESIZE 32 K”

Recommended but 
not required
Db2 
UPDATE DB CFG FOR dbName
USING AUTO_REVAL deferred_force
DECFLT_ROUNDING round_half_up

  6、 DB2中的PL/SQL代码

CREATE PACKAGE sample IS
TYPE emps_array 
IS VARRAY(30) OF VARCHAR2(6);

PROCEDURE get_dept_emp (
Dno 
IN emp.deptno%TYPE DEFAULT 1,
Emps_dno OUT emps_array );
END sample;
/
CREATE PACKAGE BODY sample IS
PROCEDURE get_dept_emp (
Dno 
IN emp.deptno%TYPE,
Emps_dno OUT emps_array) 
IS
BEGIN
IF dno IS NOT NULL THEN
SELECT empno BULK COLLECT INTO emps_dno FROM emp WHERE deptno=dno;
FOR x in emps_dno.FIRST .. emps_dno.LAST LOOP
DBMS_OUTPUT.PUT_LINE(emps_dno(x));
END LOOP;
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘SQLCODE: ’ 
|| SQLCODE);
END get_dept_empno;
END sample;
/

CREATE TYPE emp_dept
IS TABLE OF emp%ROWTYPE;


0 0
原创粉丝点击