简体   繁体   中英

SQL Poor Performance on join query

i'm experiencing really poor performance with this query, probably because of my poor experience with join. The following query have to run on a DB2 database.

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) 

Avoid using functions on table columns in where clause. Also, check whether "group by" is necessary as suggested by @jarlh

If d_ord is timestamp column, change where clause to

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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