【问题标题】:Can this SQL Statement be made to perform better?可以使这条 SQL 语句执行得更好吗?
【发布时间】:2009-09-08 09:12:46
【问题描述】:

我有一个用于将编辑从一个表合并到另一个表的 SQL 语句。即

UPDATE f
SET f.AUDAPLCDE = m.AUDAPLCDE, f.AUDSTF_NO = m.AUDSTF_NO,
 f.AUDUPD_ID = m.AUDUPD_ID, f.AUDUPDDTE = m.AUDUPDDTE,
 f.UNTTYP = m.UNTTYP,  f.UNTSTM_NO = m.UNTSTM_NO,
 f.UNTIND = f.UNTIND,  f.UNQ = m.UNQ,    
 f.TRNCTL_NO = m.TRNCTL_NO, f.TRN_NO = m.TRN_NO,
 f.STAEVT = m.STAEVT,  f.SPSDTE = m.SPSDTE,
 f.RVRRSN = m.RVRRSN,  f.AUDUPDTME = m.AUDUPDTME, 
 f.RHTTYP = m.RHTTYP,  f.ALCADJ = m.ALCADJ,
 f.RESFAC = m.RESFAC,  f.PRTDTE = m.PRTDTE,
 f.POLREF = m.POLREF,  f.OUTFAC = m.OUTFAC,
 f.OTHBENQTY = m.OTHBENQTY, f.ORIIND = m.ORIIND,
 f.ORIDTE = m.ORIDTE,  f.INRTYP = m.INRTYP, 
 f.INRREF = m.INRREF,  f.FNDTRNTYP = m.FNDTRNTYP,
 f.FNDSUBTYP = m.FNDSUBTYP, f.FNDREF = m.FNDREF,
 f.FNDPRC = m.FNDPRC,  f.EVTUNQ = m.EVTUNQ,
 f.EVTTRN_NO = m.EVTTRN_NO, f.EFVDTE = m.EFVDTE,
 f.DUEDTE = m.DUEDTE,  f.CTBPCT = m.CTBPCT,
 f.CO_REF = m.CO_REF,  f.CAL_YR = m.CAL_YR,
 f.BONSUBTYP = f.BONSUBTYP, f.BONSTA = m.BONSTA,
 f.BONDCL_YR = m.BONDCL_YR, f.BON_YR = m.BON_YR, 
 f.BENTYP = m.BENTYP,  f.BENREF = m.BENREF,
 f.BENQTY2 = m.BENQTY2,  f.BENQTY1 = m.BENQTY1,
 f.AMT = m.AMT,    f.ALCRTE = m.ALCRTE
FROM FI700 f
INNER JOIN MERGEDATA_FI700 m ON m.FI700_UNIQUE_ID = f.FI700_UNIQUE_ID
                            AND m.SSIS_UPDATE_TYPE = 'U'
                            AND m.SSIS_TIMESTAMP  in (SELECT max(mm.SSIS_TIMESTAMP) 
                                                      FROM MERGEDATA_FI700 mm 
                                                      WHERE mm.FI700_UNIQUE_ID = m.FI700_UNIQUE_ID 
                                                      AND mm.SSIS_UPDATE_TYPE = 'U')

真的,我只是想获取最新的编辑(按时间戳)字段,因为这将包含所有累积的编辑。我很确定这可以做得更好,即以某种方式将 SELECT max(mm.SSIS_TIMESTAMP)... 嵌套查询集成到它上面的连接中。

有什么想法吗?

【问题讨论】:

    标签: sql-server inner-join query-performance


    【解决方案1】:

    两件小事 - 但不确定它们是否会产生重大影响:

    AND m.SSIS_TIMESTAMP  in (SELECT max(mm.SSIS_TIMESTAMP) 
                                FROM MERGEDATA_FI700 mm 
                                WHERE mm.FI700_UNIQUE_ID = m.FI700_UNIQUE_ID 
                                AND mm.SSIS_UPDATE_TYPE = 'U')
    

    1) SSIS_TIMESTAMP 上有可以使用的索引吗??

    2) 由于您选择的是 MAX 值,您可以使用等号代替“IN”运算符:

    AND m.SSIS_TIMESTAMP = (SELECT max(mm.SSIS_TIMESTAMP) 
    

    马克

    【讨论】:

    • 其实时间戳上没有索引。我将它添加到 ID 字段和 UPDATE_TYPE 字段。感谢您的“=”评论。
    • 看到您的 SELECT max() 查询,您可能希望在 (FI700_UNIQUE_ID, SSIS_UPDATE_TYPE, SSIS_TIMESTAMP) 上创建一个索引,因为您在此处选择了所有三个字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多