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分布列字段的方法...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python命令式编程的概念,【Pyth
- 下一篇: php disable classes,