2 votes

Performance bizarre de WHERE NOT EXISTS sur DB2

J'obtiens des performances très étranges sur la version 9.1 de DB2 lorsque je lance la requête ci-dessous :

select  a.CYCL_NUM
,   a.AC_NUM
,   a.AUTHS_DTE
,   a.PL_ID
,   a.APRVD_RSPN_CDE
,   a.AUTHS_AMT
,   a.AUTHS_STS_CDE
,   a.TRAN_CTGR_CDE
,   a.MRCHN_CTGR_CDE
,   d.out_pu_au_amt
from nwhd12.chldr_auths a, nwhd12.w_chldr_ac d 
where cycl_num = 200911
and a.ac_num = d.ac_num
and APRVD_RSPN_CDE = 'APV'
and not exists (
    select 1 from auths_rev_hist b
 where a.cycl_num = b.cycl_num
        and a.auths_dte = b.auths_dte
        and a.TRAN_CTGR_CDE = b.TRAN_CTGR_CDE
        and a.PL_ID = b.pl_id
        and a.APRVD_RSPN_CDE = b.APRVD_RSPN_CDE
 and a.AUTHS_AMT = b.auths_amt
        and a.TRAN_CTGR_CDE = b.TRAN_CTGR_CDE
        and a.MRCHN_CTGR_CDE = MRCHN_CTGR_CDE
)
;

Ce qui est censé se passer, c'est que la requête accède à la partition 97 de nwhd12.chldr_auths, puisque c'est la partition correspondant au cycle 200911. Au lieu de cela, après avoir accédé à la partition 97, elle commence à accéder à toutes les autres partitions de nwhd12.chldr_auths. On m'a dit que cela était dû à l'instruction "WHERE NOT EXISTS", mais il y a toujours la restriction sur les cycles dans cette instruction (a.cycl_num = b.cycl_num), alors pourquoi analyse-t-elle toutes les partitions ?

Si je code en dur le cycle dans le where not exists, alors la requête fonctionne comme prévu.

Merci, Dave

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X