oracle 分布键,DWS使用技巧:根据ORACLE主键和唯一健批量修改DWS分布列字段的方法...
问题背景:
在批量从ORACLE迁移到DWS的场景中,经常会结构迁移过程中,只迁移了表结构而没有根据ORACLE源库情况同时设置分布列字段的问题,这样会导致所有的表均自动使用第一个字段(可用作为分布列类型)作为默认分布列,但是很多时候使用默认第一个字段作为分布列会导致严重的数据倾斜,这个时候就需要批量修改分布列字段,但是DWS并不支持直接修改分布列字段,手工去修改每个表会非常麻烦。
Hash分布表的分布列设置不合理,会导致严重的数据倾斜,进而导致查询性能严重劣化,而且个别dn性能下降造成的短板效应会阻塞整个集群的计算能力明显下降。
从实际经验来看,对ORACLE进行整库迁移以后,使用源库的主键和唯一健作为分布列字段是一个比较好的方法,能够快速且相对比较合理的解决大部分表的数据倾斜问题。
首先,将ORACLE源库的主键或唯一健导出:
expdp数据泵导出索引方法:
expdp sys/passwd directory=data_dir dumpfile=expdp.dmp CONTENT=metadata_only include=index sqlfile=expidx.sql
impdp sys/passwd directory=data_dir dumpfile=expdp.dmp include=index sqlfile=expidx.sql
生成导出SQL
-- CONNECT SYSTEM
ALTER SESSION SET EVENTS '10150 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10904 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '25475 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10407 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '10851 TRACE NAME CONTEXT FOREVER, LEVEL 1';
ALTER SESSION SET EVENTS '22830 TRACE NAME CONTEXT FOREVER, LEVEL 192 ';
-- new object type path: SCHEMA_EXPORT/TABLE/INDEX/INDEX
-- CONNECT SAPSR3
CREATE UNIQUE INDEX "SAPSR3"."S031~0" ON "SAPSR3"."S031" ("MANDT", "SSOUR", "VRSIO", "SPMON", "SPTAG", "SPWOC", "SPBUP", "WERKS", "MATNR", "LGORT")
PCTFREE 10 INITRANS 2 MAXTRANS 255
TABLESPACE "PSAPSR3" PARALLEL 1 ;
ALTER INDEX "SAPSR3"."S031~0" NOPARALLEL;
CREATE UNIQUE INDEX "SAPSR3"."ZPS00T_ZSBZCXX~0" ON "SAPSR3"."ZPS00T_ZSBZCXX" ("MANDT", "PSPID", "TAB_YEAR", "TAB_MONTH", "EQUNR", "ZFSRQ", "ZFSSJ")
PCTFREE 10 INITRANS 2 MAXTRANS 255
TABLESPACE "PSAPSR3USR" PARALLEL 1 ;
通过shell脚本简单处理:
cat expidx.sql |grep "CREATE UNIQUE INDEX" |sed 's/"//ig'|awk 'BEGIN{FS=" ON "}{print tolower($2)}'|awk '{f=$1;$1="";print f"#"$0}'|awk -F "." '{print $1"#"$2}'|sed 's/[ |(|)]//ig' > idx.txt
生成主键映射表数据:
sapsr3#s031#mandt,ssour,vrsio,spmon,sptag,spwoc,spbup,werks,matnr,lgort
sapsr3#zps00t_zsbzcxx#mandt,pspid,tab_year,tab_month,equnr,zfsrq,zfssj
sapsr3#zps13t_ghjh_zhjh#mandt,zpspid
sapsr3#zps18t0001#mandt,pspid,posid
sapsr3#zps18t0002#mandt,bednr
在DWS中创建映射表:
SET search_path = public;
CREATE TABLE tab_uniq_key (
schema_name text,
table_name text,
uniq_key text
)
WITH (orientation=row, compression=no)
DISTRIBUTE BY HASH(schema_name, table_name)
导入映射表(delimiter为#):
接下来通过下面的SQL,就可以直接生成批量整改SQL:
select
schema_name
,table_name
,uniq_key
,hash_key
,hash_key_upper
,uniq_key_upper
,'START TRANSACTION;'||
chr(10)||'CREATE SCHEMA '||schema_name||'_tmp;'||
chr(10)||'SET search_path='||schema_name||'_tmp;'||
chr(10)||replace(replace(tabledef,'DISTRIBUTE BY HASH('||
case
when hash_key=lower(hash_key)
then hash_key
else hash_key_upper end
||')','DISTRIBUTE BY HASH('|| case when hash_key=lower(hash_key) then uniq_key else uniq_key_upper end||')'),'SET search_path = ','--SET search_path = ')||
chr(10)||'INSERT INTO '||schema_name||'_tmp."'||table_name||'" SELECT * FROM '||schema_name||'."'||table_name||'";'||
chr(10)||'DROP TABLE '||schema_name||'."'||table_name||'";'||
chr(10)||'ALTER TABLE '||schema_name||'_tmp."'||table_name||'" SET SCHEMA '||schema_name||';'||
chr(10)||'DROP SCHEMA '||schema_name||'_tmp CASCADE;'||
chr(10)||'COMMIT;' as tab_def
from
(
select
n.nspname as schema_name
,c.relname as table_name
,getdistributekey(c.oid) hash_key
,u.uniq_key
,'"'||replace(replace(upper(uniq_key),'"',''),',','","')||'"' uniq_key_upper
,'"'||replace(replace(getdistributekey(c.oid),'"',''),',','","')||'"' hash_key_upper
,pg_get_tabledef(c.oid) tabledef
from
pg_class c
,pg_namespace n
,tab_uniq_key u
where
c.relnamespace = n.oid
and lower(n.nspname) = lower(u.schema_name)
and lower(c.relname) = lower(u.table_name)
and c.relkind = 'r'
and n.nspowner != '10'
)
where
replace(replace (lower(hash_key),'"' , '' ),' ','') != replace ( REPLACE(lower(uniq_key),'"' , ''),' ','' )
order by schema_name,table_name;
查询结果中tab_def字段即为批量整改SQL语句
oracle 分布键,DWS使用技巧:根据ORACLE主键和唯一健批量修改DWS分布列字段的方法...相关推荐
- 主键由数据库mysql 映射native_Hibernate主键生成策略详解
转载自:http://blog.csdn.net/wanghuan203/article/details/7562395 hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定 ...
- java获取mysql表的主键_Spring中获取数据库表主键序列
在程序开发中,我们经常有写数据库表的操作,数据表中经常带有主键自增序列,如何获取自增序列.spring中提供了相应的类 DataFieldMaxValueIncrementer. DataFieldM ...
- mybatis 主键自增 insert后返回主键
mybatis 主键自增 insert后返回主键 : <insert id="insertStudentAutoKey" parameterType="Studen ...
- 数据库加主键sql_SQL数据库设计:选择主键
数据库加主键sql There are a couple of rules to follow when choosing a primary key for a table: all records ...
- MySQL自增主键auto_increment原理 与 自增主键出现间隙不连续现象的定位
一.背景: 1.1.业务描述与SQL: 为了保存机器上报信息(业务需求是每个机器只需保存最新的一条记录),原 SQL 语句如下(其中,machineId 的为唯一索引,t_report_pad 的 i ...
- 联合主键是什么意思,联合主键怎么创建
联合主键就是用2个或2个以上的字段组成主键. 用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引. 可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no ...
- 数据库外键的作用,以及和主键的区别
http://blog.csdn.net/tiantian1980/article/details/1603126 外键是数据库一级的一个完整性约束,就是数据库基础理论书中所说的"参照完整性 ...
- mysql 主键约束起名_MySQL名称的主键约束
数据定义语句: CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar( ...
- sqlserver新增主键自增_SQLSERVER自增主键
SQLSERVER自增主键 SQLServer 中含自增主键的表,通常不能直接指定ID值插入,可以采用以下方法插入. 1. SQLServer 自增主键创建语法: identity(seed, inc ...
最新文章
- 【分治】P1228 地毯填补问题(多联骨牌覆盖棋盘问题)(递归,分治)难度⭐⭐⭐
- Android中访问通讯录,数据的增删改查
- 漫步凸分析三——凸集代数
- CVPR 2021 | 又好又快的视频异常检测,引入元学习的动态原型学习组件
- 新微擎 v1.7.9 图文回复 标题emoji
- 20180908 2018-2019-2 《密码与安全新技术专题》第3周作业
- 微信公众号申请人身核验-流程
- 无线Mesh网络技术及其应用
- 企业微信客户朋友圈怎么发?朋友圈规则有哪些?
- PAKDD2018小结
- 企业如何制作自己的公司网站?
- 汽车电子触摸屏产品EMC设计要领
- 最适合小白的编程语言是什么?网友直呼:那当然是Python!
- 华师c语言作业,C语言程序设计(华师在线作业)1.doc
- 运放放大倍数计算公式_电源经典运放电路,加法器,减法器,同向放大器,反向放大器...
- 基于.Net TcpListener 实现 WebSocketServer 通讯
- Facebook内部高效工作PPT指南
- 为什么在ROS中启动小乌龟后,无法用键盘控制?
- java 生成图形验证码
- java 数据库 火车票管理系统6_基于Java火车票售票管理系统