ABAP 两种多表查询的性能比较
在ABAP程序设计中,代码的优化非常重要,当数据量比较大的时候(例如上万或十万条记录),如果所需要的数据不在同一张表中,查询时需要对多表进行内连接。这时要注意一个问题,连接的表不能太多,否则会出现数据重复或是数据丢失的情况,而且查询的效率也会降低。
比较推荐的方法是:
先建立内表,用来存放数据库中的数据
先将少量表连接,将部分数据插入到内表中去
建立一个存放剩余数据的小内表
使用(for all entries in [大内表] where [数据库字段] = 内表字段)将大表已经存在的数据作为条件,把数据库中所需的剩余数据填充到小内表中
循环大内表, read 小内表, 将小内表的数据 modify 到大内表中。
这种查询方法很大程度的减少了多表连接时出现的BUG (重复数据,数据丢失)。
以下是测试的两个DEMO,由于数据量没有足够大,第一种查询的效率要高于第二种查询,主要是因为前者与数据库只交互了一次,而后者交互了两次,但在真实项目中,数据量往往很大,所以第二种是比较推荐的方法。
数据库表ZTALV_SZ 包含了所需字段
######################################################################################
##########
######################################################################################
REPORT z_scott_join .
TABLES: vbap,vbep,vbak,kna1,ztalv_sz.
PARAMETERS p LIKE vbap-vbeln VALUE CHECK.
DATA: BEGIN OF itab OCCURS 0.
DATA: END OF itab.
***********************************************************************
* Event Start-of-selection
***********************************************************************
START-OF-SELECTION.
######################################################################################
##########
######################################################################################
REPORT z_scott_join2 .
TABLES: vbap,vbep,vbak,kna1,ztalv_sz.
PARAMETERS p LIKE vbap-vbeln VALUE CHECK.
DATA: BEGIN OF itab OCCURS 0.
DATA: END OF itab.
DATA: BEGIN OF sub_itab OCCURS 0,
**********************************************************
*Event start-of-selection
**********************************************************
START-OF-SELECTION.