Skip to Content
1
Feb 20, 2020 at 07:29 PM

ABAP CDS performance using mard vs using ndsm_e_mard

3334 Views Last edit Feb 20, 2020 at 08:28 PM 2 rev

Hello everyone,

I'm creating a CDS view joining tables MARA, MARC, MARD, MBEW and MAKT. But if I use MARD, I get wrong values for labst (always return 0), so I have to use ndsm_e_mard instead.

The problem is that while using MARD I get response time of 150.000-250.000 microseconds, while just changing mard for ndsm_e_mard, the response time rises to aprox 1.000.000-1.300.000 microseconds.

How is this possible, shouldn't ndsm_e_mard be optimized and return faster times?

Hope I can get some help here.

Below is my code for CDS

@AbapCatalog.sqlViewName: 'ZTSTMAT'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Test'
define view ztstmat_svc
    as select from mara
        inner join marc                             on  marc.matnr = mara.matnr
        inner join mard                             on  mard.matnr = marc.matnr
                                                    and mard.werks = marc.werks
        inner join mbew                             on  mbew.matnr = marc.matnr
                                                    and mbew.bwkey = marc.werks
        inner join makt                             on  makt.matnr = mara.matnr                                                                 
{
    key mara.matnr,
        mara.meins,
        mara.lvorm,
        mara.matkl,
        mara.mtart,
        mara.xchpf,
        mara.begru,
        marc.mmsta,
        marc.werks,
        marc.ausme,
        mard.lgort,
        mard.labst,
        mbew.bwkey,
        mbew.peinh,
        mbew.bwtar,
        makt.maktx,
        makt.spras,
        
        case marc.ausme
            when ' ' then mara.meins
            when ''  then mara.meins
             else         marc.ausme
        end                  as Unit
}
  
where
        mara.begru <> 'CAFU'
    and mara.lvorm <> 'X'
    and mara.matkl >  '11000000'
    and marc.lvorm <> 'X'
    and marc.mmsta <> '03'
    and marc.mmsta <> 'Z3'
    and mbew.bwtar =  ''
    and mard.labst <> 0
    and makt.spras = $session.system_language
/*   

I execute from my program like this:

SELECT matnr, xchpf, mtart, werks, peinh, maktx, unit, labst
    FROM ztstmat_svc
    INTO TABLE @Data(c_data)
    WHERE werks EQ @pa_werks
    and   lgort in @so_lgort.

    sort c_data by matnr.
    DELETE ADJACENT DUPLICATES FROM c_data COMPARING matnr.