【IT168 技术】本文讲解了从Oracle到DB2迁移的非常好的解决方案,主要从三件事开始:
一、某电信公司的转型故事
1、该电信公司数据仓库技术结构:
· 省中心BOSS数据加载到DB2中央数据仓库中。
· 中央数据仓库生成地市所需要的中间结果或分析结果并加载到数据集市中。
· BI应用包括仓库应用和集市应用。
2、硬件结构
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来说明。
2)热表数据在32个分区分布极不均匀。
通过下面的语句发现表ACCA_ITEM在32个分区上数据分布极不均匀,下面是查找该表在 32 个节点上数据分布所使用的语句:
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定义
“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支持的分区特性一览表
概念上相似,用法略有不同。另外也可以组合使用:
9、背后的深层次原因-转型问题
1) 电信公司
前期请了多加资讯公司做了可行性分析,对经营分析系统报以厚望,从上到下投入都很大。
2) 项目进度要求
时间紧,任务重。
3) 技术人员情况
刚从Oracle转型过来的,只接受过DB2入门级的培训,经验主义严重,不熟悉DB2设计技术,对使用DB2开发存在“恐惧”心理。
二、从Oracle到DB2设计转型
1、 术语对比
2、 产品和工具对比
3、 Oracle系统架构
1) Oracle System ID(非RAC架构)
一个Oracle SID一次只能访问一个数据库,“Instance”指内存和访问数据的后台进程组成,“Database”指用于存储信息的物理文件。
4、 DB2系统架构
DB2服务器可以创建多个实例,每个实例可以同时访问多个数据库;每个实例中运行多个引擎派遣单元 Engine Dispachable Units(EDUs);每个实例有自己的配置(dbm cfg)。
5、 存储模型对比
6、 全局临时表:DB2功能更多
临时表不会被锁定,在插入、更新时不产生redo log,容易维护,通常用来保存操作的中间结果集来提升性能:
7、 视图:非常相似
Oracle和DB2视图功能相似,如下表所示:
8、 索引:难分仲伯
9、 序列:DB2更细腻
用法上相同,DB2还支持标识列:
10、约束:Oracle更灵活
区别见下表:
三、当Oracle开发者遇到DB2
1、 数据库开发的难点
1) 用户的选择。
第一,选择其中一种数据库并与之绑定;第二,支持两种或多种数据库并维护针对每种数据库的实现;第三,只是用各种数据库都支持的功能。
2) 上面的任何一种选择都不理想。
2、 DB2 V9.7的新思路
内置地支持Oracle的语法,语义及相关工具:客户通过开关参数选择使用DB2还是Oracle语境,同意执行引擎保证PL/SQL和SQL PL有相同的性能。
3、 DB2 9.7支持下面的Oracle功能
只有极少情况下才需要更改。
4、 并发控制比较
1) Oracle默认情况
语句级快照。
2) DB2 V9.7之前默认情况
游标稳定隔离级别。
3) DB2 V9.7目前默认情况
当前提交隔离级别。
5、 创建兼容Oracle的DB2数据库
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代码
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;