如何比较两个表之间的10个字段

时间:2016-02-11 21:20:45

标签: mysql

我正在尝试将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列。 感谢。

1 个答案:

答案 0 :(得分:1)

只要JOIN(和WHERE)条件不包含OR或执行功能(例如DATELEFT,{{1}等等...),适当构建的索引可以提供显着的性能提升。

通过“适当构造”,我指的是在它们包含的字段中首先具有有用字段的索引;如果你只是加入/过滤“谁”而你的索引是“何时和谁”(按此顺序),它将无济于事。