我正在尝试将11列tableA与13列tableB中的11个进行比较,并在表B中更改第12列(指标)是否匹配。
SET SQL_SAFE_UPDATES=0;
UPDATE `DDL_STAGING`.`MTDT_STG` S
INNER JOIN `REFERENCE`.`REF_DATA_MODELS` D
ON S.`MDL_LAYER` = D.`MDL_LAYER`
AND S.`SBJT` = D.`SBJT`
AND S.`SCHEMA_NM` = D.`SCHEMA_NM`
AND S.`TBL_NM` = D.`TBL_NM`
AND S.`TBL_TYPE` = D.`TBL_TYPE`
AND S.`CLMN_NM` = D.`CLMN_NM`
AND S.`CLMN_DTYP` = D.`CLMN_DTYP`
AND S.`NULL_IND` = D.`NULL_IND`
AND S.`PK_IND` = D.`PK_IND`
AND S.`DFLT_VAL` = D.`DFLT_VAL`
AND S.`FK_TBL_ID` = D.`FK_TBL_ID`
AND S.`FK_CLMN_ID` = D.`FK_CLMN_ID`
AND S.`CLMN_ORD`= D.`CLMN_ORD`
SET S.ACTN_IND = 'U';
SET SQL_SAFE_UPDATES=1;
当然,这需要永远,并且已经将工作台锁定了两次。 我尝试引入哈希检查,以便我可以比较1列:
MD5(M.MDL_LAYER_ID |'~'| PKG.LOGL_PKG_NM | '~' | PC.PHYS_TBL_SCHEMA | '~' | PC.PHYS_TBL_NM | '~' |
PC.PHYS_TBL_TYPE |'~'| PC.PHYS_CLMN_NM |'~'| PC.PHYS_CLMN_DTYP | '~' | PC.PHYS_CLMN_NULL | '~' |
CASE WHEN PK.PHYS_CLMN_ID IS NOT NULL THEN 'Y' ELSE NULL END | '~' | PC.PHYS_CLMN_DFLT_VAL | '~' |
F.Ttbl | '~' | F.Tcol) AS HASH_VAL
但是当填充列时,但是某些列为null,这导致HASH_VAL列中有很多空条目。我无法在那里比较。
所以我尝试进入:
MD5(M.MDL_LAYER_ID |'~'| ifnull(PKG.LOGL_PKG_NM,'') | '~' | ifnull(PC.PHYS_TBL_SCHEMA,'') | '~' | ifnull(PC.PHYS_TBL_NM,'') | '~' |
ifnull(PC.PHYS_TBL_TYPE,'') |'~'| ifnull(PC.PHYS_CLMN_NM,'') |'~'| ifnull(PC.PHYS_CLMN_DTYP,'') | '~' | ifnull(PC.PHYS_CLMN_NULL,'') | '~' |
CASE WHEN PK.PHYS_CLMN_ID IS NOT NULL THEN 'Y' ELSE '' END | '~' | ifnull(PC.PHYS_CLMN_DFLT_VAL,'') | '~' |
ifnull(F.Ttbl,'') | '~' | ifnull(F.Tcol,'')) AS HASH_VAL
但是这导致了所有背诵的SAME HASH值。
我可以在这做什么?记住,这两个表只匹配13列中的11列。 感谢。
答案 0 :(得分:1)
只要JOIN
(和WHERE
)条件不包含OR
或执行功能(例如DATE
,LEFT
,{{1}等等...),适当构建的索引可以提供显着的性能提升。
通过“适当构造”,我指的是在它们包含的字段中首先具有有用字段的索引;如果你只是加入/过滤“谁”而你的索引是“何时和谁”(按此顺序),它将无济于事。