问题背景:

在批量从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分布列字段的方法...相关推荐

  1. 主键由数据库mysql 映射native_Hibernate主键生成策略详解

    转载自:http://blog.csdn.net/wanghuan203/article/details/7562395 hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定 ...

  2. java获取mysql表的主键_Spring中获取数据库表主键序列

    在程序开发中,我们经常有写数据库表的操作,数据表中经常带有主键自增序列,如何获取自增序列.spring中提供了相应的类 DataFieldMaxValueIncrementer. DataFieldM ...

  3. mybatis 主键自增 insert后返回主键

    mybatis 主键自增 insert后返回主键 : <insert id="insertStudentAutoKey" parameterType="Studen ...

  4. 数据库加主键sql_SQL数据库设计:选择主键

    数据库加主键sql There are a couple of rules to follow when choosing a primary key for a table: all records ...

  5. MySQL自增主键auto_increment原理 与 自增主键出现间隙不连续现象的定位

    一.背景: 1.1.业务描述与SQL: 为了保存机器上报信息(业务需求是每个机器只需保存最新的一条记录),原 SQL 语句如下(其中,machineId 的为唯一索引,t_report_pad 的 i ...

  6. 联合主键是什么意思,联合主键怎么创建

    联合主键就是用2个或2个以上的字段组成主键. 用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引. 可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no ...

  7. 数据库外键的作用,以及和主键的区别

    http://blog.csdn.net/tiantian1980/article/details/1603126 外键是数据库一级的一个完整性约束,就是数据库基础理论书中所说的"参照完整性 ...

  8. mysql 主键约束起名_MySQL名称的主键约束

    数据定义语句: CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar( ...

  9. sqlserver新增主键自增_SQLSERVER自增主键

    SQLSERVER自增主键 SQLServer 中含自增主键的表,通常不能直接指定ID值插入,可以采用以下方法插入. 1. SQLServer 自增主键创建语法: identity(seed, inc ...

最新文章

  1. 【分治】P1228 地毯填补问题(多联骨牌覆盖棋盘问题)(递归,分治)难度⭐⭐⭐
  2. Android中访问通讯录,数据的增删改查
  3. 漫步凸分析三——凸集代数
  4. CVPR 2021 | 又好又快的视频异常检测,引入元学习的动态原型学习组件
  5. 新微擎 v1.7.9 图文回复 标题emoji
  6. 20180908 2018-2019-2 《密码与安全新技术专题》第3周作业
  7. 微信公众号申请人身核验-流程
  8. 无线Mesh网络技术及其应用
  9. 企业微信客户朋友圈怎么发?朋友圈规则有哪些?
  10. PAKDD2018小结
  11. 企业如何制作自己的公司网站?
  12. 汽车电子触摸屏产品EMC设计要领
  13. 最适合小白的编程语言是什么?网友直呼:那当然是Python!
  14. 华师c语言作业,C语言程序设计(华师在线作业)1.doc
  15. 运放放大倍数计算公式_电源经典运放电路,加法器,减法器,同向放大器,反向放大器...
  16. 基于.Net TcpListener 实现 WebSocketServer 通讯
  17. Facebook内部高效工作PPT指南
  18. 为什么在ROS中启动小乌龟后,无法用键盘控制?
  19. java 生成图形验证码
  20. java 数据库 火车票管理系统6_基于Java火车票售票管理系统

热门文章

  1. 肤色检测算法 - 基于二次多项式混合模型的肤色检测
  2. 利用shell脚本来监控linux系统的内存
  3. python多边形图案_如何用matplotlib中的自定义图案填充多边形?
  4. clodeblocks debug断点调试_Intellij IDEA高阶DEBUG大杀器
  5. 使用 labelImg 制作YOLO系列目标检测数据集(.xml文件)
  6. 农发行:BI数据平台建设
  7. 同程旅游缓存系统(凤凰)打造Redis时代的完美平台实践
  8. 分组密码的工作模式--wiki
  9. mysql悲观锁总结和实践--转
  10. 多台Linux服务器SSH相互访问无需密码--转