💅文章概要: 在本节内容中,我们将继续学习ABAP OPEN SQL的知识,今天带来的内容是ABAP SQL性能优化的开篇,在上一节中我们介绍了SAT事务码的运用,为大家打下了坚实的基础,相信各位小伙伴们都已经熟知如何使用SAT事务码进行程序性能分析了吧!那么从本节开始将正式进入SQL性能优化实战部分!拿起键盘跟我练,一路火光带闪电!
在本节内容中,我们将继续学习ABAP OPEN SQL的知识,今天带来的内容是ABAP SQL性能优化的开篇,在上一节中我们介绍了SAT事务码的运用,为大家打下了坚实的基础,相信各位小伙伴们都已经熟知如何使用SAT事务码进行程序性能分析了吧!那么从本节开始将正式进入SQL性能优化实战部分!拿起键盘跟我练,一路火光带闪电!
本文所有案例都是基于一个我自己创建的Z表
,该表结构如上图所示,供各位小伙伴们对照来观察代码运行结果:
关于ABAP SQL新语法
的介绍将在本系列的最后进行介绍,这里只列举ABAP SQL新语法最基础的应用:
以下是ABAP SQL新语法
的一般语法样式:
SELECT ...
FROM table_name
INTO @DATA(lt_name)
WHERE ...
LOOP AT lt_name INTO DATA(ls_name)
...
ENDLOOP.
参数介绍:
<table_name>
: 目标数据库表<lt_name>
: 临时内表。<ls_name>
: 临时工作区。 下面给出一个详细的案例来对比使用ABAP SQL新语法
前后语句性能的变化
:
PS:使用ABAP SQL新语法时会进入
严格检查模式
,程序中所有的代码都要使用新语法,OPEN SQL老语法的变量需要在前面加“@”
来进行区分!
FORM form_01 .
DATA:gt_student TYPE TABLE OF zstudent_wyz,
gs_student TYPE zstudent_wyz.
SELECT zschool zcode INTO CORRESPONDING FIELDS OF TABLE gt_student
FROM ZSTUDENT_WYZ .
LOOP AT gt_student INTO gs_student.
WRITE: / gs_student-zschool,gs_student-zcode.
ENDLOOP.
ENDFORM.
START-OF-SELECTION.
PERFORM form_01.
PS:语句性能分析如下:
下面图一为1000条目数的语句性能,图二为10000条目数的语句性能
FORM form_01 .
SELECT carrid,connid,fldate INTO TABLE @DATA(gt_sflight)
FROM sflight .
LOOP AT gt_sflight INTO DATA(gs_sflight).
WRITE: / gs_sflight-carrid,gs_sflight-connid,gs_sflight-fldate.
ENDLOOP.
ENDFORM.
START-OF-SELECTION.
PERFORM form_01.
PS:语句性能分析如下:
下面图一为1000条目数的语句性能,图二为10000条目数的语句性能
可以看到ABAP SQL新语法在处理大量数据的时候SQL语句花费的时间要比老语法小很多
。因此,新语法在处理大批量数据的时候性能会更加优越
,并且语法更加简洁
,是我们每一个ABAPer都需要学会并且掌握的!
PS:不过在某些特殊场景,或者数据量较小的时候。ABAP SQL老语法会更加适合,并且在老系统版本(
ECC
)中,很多ABAP SQL新语法是不支持的,只能使用老语法!
综上所述:ABAP SQL新老语法我们都需要学会并且掌握
,并且熟练运用ABAP SQL新语法后会在工作中更加如鱼得水!
关于这部分内容的讲解,在上一篇文章「SAP ABAP」OPEN SQL(九)【SAT事务码】的结尾进行了详细的介绍,大家可以去看看哦!这里我就直接把结论放出来!
PS:在使用SELECT语句的时候,最好
只选择我们要用到的字段
!使用"SELECT *
"语句的性能开销会更大一些!
ABAP中支持一种SELECT...ENDSELECT
的结构,就是可以在SELECT中对取得的每一行数据(或是几个字段)可以先放入一个行结构(或是几个字段)中,再做处理。
初看似乎觉得蛮有用的,的确这个结构本身就是为了方便处理数据的。但是,如果你滥用了这种结构,那么会严重影响程序性能。因为数据量大了之后,在SELECT和END SELECT之间做处理的时间会很长,从而导致数据库端因为连接超时而断开
。
PS:由此可以判断,SELECT-END SELECT语句在整个过程中是保持数据库连接的,对数据库绝对是个负担。
所以,在大数据量处理的报表
中,不能用SELECT…END SELECT这种写法。
对于ABAP来说,不推荐使用子查询语句
,一旦数据量过大效率就很难保证!执行子查询时,会先创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。
如果确定只需要查找一条数据时,建议使用SELECT SINGLE...
。除此之外还可使用ORDER BY
配合UP TO 1 ROWS ...
来查找某一字段值的最大值,这样子性能开销会更小!
下面将进行一个详细的案例讲解,帮助各位小伙伴们进行对比观察使用SELECT SINGLE
前后的语句性能开销:
业务背景:已经数据库表SFLIGHT如下图所示,现在我确定只需要查找
CARRID = AC
,CONNID = 0820
,FLDATE = 2002/02/18
的该条数据,并且打印输出到屏幕上。
PS:按照传统方式,需要先根据检索条件将数据从数据库表中查询并且INTO到内表中,再将内表循环至结构体变量中。
FORM form_01 .
SELECT carrid,connid,fldate INTO TABLE @DATA(gt_sflight)
FROM sflight
WHERE carrid = 'AC' AND
connid = 0820 AND
fldate = '20020218'.
LOOP AT gt_sflight INTO DATA(gs_sflight).
WRITE: / gs_sflight-carrid,gs_sflight-connid,gs_sflight-fldate.
ENDLOOP.
ENDFORM.
START-OF-SELECTION.
PERFORM form_01.
FORM form_01 .
SELECT SINGLE carrid,connid,fldate INTO @data(gs_sflight)
FROM sflight
WHERE carrid = 'AC' AND
connid = 0820 AND
fldate = '20020218'.
WRITE: / gs_sflight-carrid,gs_sflight-connid,gs_sflight-fldate.
ENDFORM.
START-OF-SELECTION.
PERFORM form_01.
在做了多轮试验后,确实证明使用SELECT SINGLE语句效率会更高!
PS:上述截图只截取了其中有代表性的一次!
本文花费大量时间介绍了ABAP SQL性能优化第一篇
,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!