繁体   English   中英

SQL 连接查询性能不佳

[英]SQL Poor Performance on join query

我在使用这个查询时遇到了非常糟糕的性能,可能是因为我在加入方面的经验很差。 以下查询必须在 DB2 数据库上运行。

SELECT A.n_ann_ord
       || A.n_prg_ord     AS numeroOrdine,
       DATE(B.d_ins)      AS dataInserimentoEGO,
       DATE(A.d_ord)      AS dataInserimento,
       C.n_lot_prd        AS lotto,
       E.t_rag_soc        AS consorzio,
       D.t_rag_soc        AS cliente,
       b.c_obu_new        AS obuid,
       j.c_tar            AS targa,
       j.c_naz            AS nazione,
       C.c_pos            AS postazione,
       CASE
         WHEN B.f_ric_obu_sat = 'S' THEN 'Satellitare'
         ELSE 'Non Satellitare'
       END                AS tipoTitolo,
       F.t_des            AS statoOrdine,
       CASE
         WHEN (SELECT 1
               FROM   evda.tetsau_sos_tit_mul X
               WHERE  x.d_ord = a.d_ord
               FETCH first ROW only) = 1 THEN 'S'
         ELSE 'N'
       END                AS SOSTITUZIONE,
       DATE(G.d_ape_pro)  AS aperturaLotto,
       DATE(G.d_chiu_pro) AS chiusuraLotto,
       DATE(G.d_com_con)  AS confezionamento,
       DATE(C.d_spe_spe)  AS spedizione,
       C.c_ide_spe        AS trackingNumber,
       DATE(H.d_acq_con)  AS consegna
FROM   evda.tetsvi_ord A
       JOIN evda.tets3t_int_srv B
         ON A.c_ctp_cli = B.c_ctp_cli
            AND A.d_ord = B.d_ord
       JOIN evda.tetski_int_con_ord C
         ON A.c_ctp_cli = C.c_ctp_cli
            AND A.d_ord = C.d_ord
       JOIN evda.tets25_ctp D
         ON C.c_ctp_cli = D.c_ctp
       JOIN evda.tets25_ctp E
         ON C.c_ctp_con = E.c_ctp
       JOIN evda.tetsvk_sta_ord F
         ON A.c_sta_ord = F.c_sta_ord
       JOIN evda.tetsvp_pre_tit I
         ON a.c_ctp_cli = i.c_ctp_cli
            AND a.d_ord = i.d_ord
       JOIN evda.tetsmj_tit_pre_est J
         ON a.c_ctp_cli = j.c_ctp_cli
            AND a.d_ord = j.d_ord
            AND b.n_prg_tit_pre = j.n_prg
       LEFT JOIN evda.tetskk_lot_prd G
              ON C.n_lot_prd = G.n_lot_prd
       LEFT JOIN evda.tets3u_int_srv_spe H
              ON B.d_ins = H.d_ins
WHERE  DATE(a.d_ord) <= CURRENT_DATE
       AND DATE(a.d_ord) >= CURRENT_DATE - 30 DAYS
GROUP  BY A.n_ann_ord
          || A.n_prg_ord,
          DATE(B.d_ins),
          DATE(A.d_ord),
          C.n_lot_prd,
          E.t_rag_soc,
          D.t_rag_soc,
          b.c_obu_new,
          j.c_tar,
          j.c_naz,
          C.c_pos,
          B.f_ric_obu_sat,
          F.t_des,
          a.d_ord,
          DATE(G.d_ape_pro),
          DATE(G.d_chiu_pro),
          DATE(G.d_com_con),
          DATE(C.d_spe_spe),
          C.c_ide_spe,
          DATE(H.d_acq_con) 

避免在 where 子句中对表列使用函数。 另外,检查@jarlh 建议的“分组依据”是否是必要的

如果 d_ord 是时间戳列,则将 where 子句更改为

a.d_ord < timestamp( CURRENT_DATE + 1 days)
 AND a.d_ord >= timestamp( CURRENT_DATE - 30 DAYS )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM