dl6事件是真实事件吗:ABAP 两种多表查询的性能比较

来源:百度文库 编辑:偶看新闻 时间:2024/05/01 08:39:12


     在ABAP程序设计中,代码的优化非常重要,当数据量比较大的时候(例如上万或十万条记录),如果所需要的数据不在同一张表中,查询时需要对多表进行内连接。这时要注意一个问题,连接的表不能太多,否则会出现数据重复或是数据丢失的情况,而且查询的效率也会降低。

 

比较推荐的方法是:

先建立内表,用来存放数据库中的数据

先将少量表连接,将部分数据插入到内表中去

建立一个存放剩余数据的小内表

使用(for all entries in [大内表] where [数据库字段] = 内表字段)将大表已经存在的数据作为条件,把数据库中所需的剩余数据填充到小内表中

循环大内表, read 小内表, 将小内表的数据 modify 到大内表中。

 

这种查询方法很大程度的减少了多表连接时出现的BUG (重复数据,数据丢失)。

 

以下是测试的两个DEMO,由于数据量没有足够大,第一种查询的效率要高于第二种查询,主要是因为前者与数据库只交互了一次,而后者交互了两次,但在真实项目中,数据量往往很大,所以第二种是比较推荐的方法。

 

数据库表ZTALV_SZ 包含了所需字段

 

######################################################################################

##########                            Demo                         ################

######################################################################################

REPORT z_scott_join .

 

TABLES: vbap,vbep,vbak,kna1,ztalv_sz.

 

PARAMETERS p LIKE vbap-vbeln VALUE CHECK.

 

DATA: BEGIN OF itab OCCURS 0.

        INCLUDE STRUCTURE ztalv_sz.

DATA: END OF itab.

 

***********************************************************************

* Event Start-of-selection

***********************************************************************

START-OF-SELECTION.

 

 

  SELECT ap~vbeln ap~posnr ep~wmeng ap~netwr ap~waerk ep~edatu k~name1

    INTO CORRESPONDING FIELDS OF TABLE itab

      FROM vbap AS ap

        INNER JOIN vbep AS ep ON ap~vbeln = ep~vbeln

                              AND ap~posnr = ep~posnr

        INNER JOIN vbak AS ak ON ak~vbeln = ap~vbeln

        INNER JOIN kna1 AS k  ON  k~kunnr = ak~kunnr

          WHERE ap~vbeln = p.

 

 

  LOOP AT itab.

    WRITE: / itab-vbeln,

             itab-posnr,

             itab-wmeng,

             itab-netwr,

             itab-waerk,

             itab-edatu,

             itab-name1.

  ENDLOOP.

 


######################################################################################

##########                            Demo 2                          ################

######################################################################################


REPORT z_scott_join2 .

 

TABLES: vbap,vbep,vbak,kna1,ztalv_sz.

 

PARAMETERS p LIKE vbap-vbeln VALUE CHECK.

 

DATA: BEGIN OF itab OCCURS 0.

        INCLUDE STRUCTURE ztalv_sz.

DATA: END OF itab.

 

DATA: BEGIN OF sub_itab OCCURS 0,

        vbeln LIKE vbak-vbeln,

        name1 LIKE kna1-name1,

      END OF sub_itab.

 

**********************************************************

*Event start-of-selection

**********************************************************

START-OF-SELECTION.

 

 

  SELECT ap~vbeln ap~posnr ep~wmeng ap~netwr ap~waerk ep~edatu

    INTO CORRESPONDING FIELDS OF TABLE itab

      FROM vbap AS ap

        INNER JOIN vbep AS ep ON ap~vbeln = ep~vbeln

                             AND ap~posnr = ep~posnr

          WHERE ap~vbeln = p.

 

 

  SELECT ak~vbeln k~name1

    INTO TABLE sub_itab

      FROM vbak AS ak

        INNER JOIN kna1 AS k ON ak~kunnr = k~kunnr

          FOR ALL ENTRIES IN itab WHERE ak~vbeln = itab-vbeln.

 

  LOOP AT itab.

    READ TABLE sub_itab WITH KEY vbeln = itab-vbeln.

    itab-name1 = sub_itab-name1.

    MODIFY itab.

    CLEAR itab.

    CLEAR sub_itab.

  ENDLOOP.

 

  LOOP AT itab.

    WRITE: / itab-vbeln,

             itab-posnr,

             itab-wmeng,

             itab-netwr,

             itab-waerk,

             itab-edatu,

             itab-name1.

  ENDLOOP.