日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 分布键,DWS使用技巧:根据ORACLE主键和唯一健批量修改DWS分布列字段的方法...

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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分布列字段的方法...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。