ABAP程序效率优化——一个简单的SQL竟然如此坑爹……

一个简单的需求,一个简单的SQL,执行起来竟慢的可怕。原因为何,如何解决,看我慢慢道来。

本文目录如下:

1、需求;2实现;3-11、问题分析解决;12总结

(1/12)需求


根据项目号,取WBS,然后根据AUFK~PSPEL=WBS,取AUFK和AFKO的数据。同时还需要根据WBS取一些额外的其他数据。

(2/12)实现


因为WBS还有它用,所以我先取出WBS,放到内表GT_PRPS中。

接下来,取AUFK和AFKO的逻辑如下:

(3/12)问题-第一步


执行时,发现执行的非常慢,然后用ST05(使用说明参见这里)进行执行计划分析,结果如下:

(4/12)问题解释-第一步


慢的原因有两个:

1、看上面where条件中,PSPEL IN中只有5个值,而我的GT_PRPS中条目数(是全都不重复的),共有上万条。这样就相当于,这条语句要执行2000多次

2、下面红框框出来的部分,TABLE ACESS FULL AKFO。在AFKO和AUFK关联的时候,用的是AUFNR,这个字段是这两个表的主键。不知道为什么,这里没有通过主键的索引取值,而是执行了全表扫描。

擦嘞,这坑爹的执行计划!

(5/12)解决方案-第一步


为解决上述两个问题:

1、当for all entries in的内表,只用到一个字段时,使用hints改变SQL执行计划中IN的条目数

2、使用hints指定用表的哪个索引。为防止AUFK也出现不使用索引的情况,在此也为AUFK指定索引。

如下图:

解释如下:

1、T_00为AUFK,T_01为AFKOAUFK~D为AUFK中包含PSPEL字段的索引,AFKO~0为AFKO的主键索引

2、prefer_in_itab_opt指定为1,表示将GT_PRPS中的值转为WHERE ... IN ..的方式,max_in_blocking_factor表示每个IN中最大的条目数,这极有效的减少了SQL执行的数量。

(6/12)问题-第二步


本以为执行结果应该正常,但是ST05的执行计划却如下:

(7/12)问题解释-第二步


ST05的执行计划显示,数据库首先进行了AFKO的SCAN,然后再进行了AUFK的SCAN。但是我们的查询条件是AUFK的PSPEL,这不符合我们的要求。所以,还是需要继续干预一下SQL的执行计划。

【注意:我也可以不通过AUFK和AFKO JOIN的方式来取数,改为两次for all entries in(先from aufk,再from afko),但是需要定义额外的内表,并进行数据处理。而且我的目的是要优化这个简单SQL的执行计划】

(8/12)解决方案-第二步


干预SQL的执行计划,让它按照表出现的顺序来执行。

【此处,ordered可以用leading代替。leading表示先访问AUFK,ordered表示按照AUFK、AFKO的顺序访问

(9/12)问题-第三步


再次执行,查看执行计划,发现顺序是没问题了,但是执行计划中,表AFKO~0这个索引的使用方式存在问题。

(10/12)问题解释-第三步


查看AFKO~0的索引如下,包括MANDT和AUFNR两个字段:

数据库在ACCESS AFKO时,却只用到了索引中的MANDT,这没什么卵用啊。

再看6Hash Join时,才将AFKO和AUFK的数据进行匹配处理。

(11/12)解决方案-第三步


我初步猜测是因为JOIN的方式影响的,这种情况下,一般常见的都是NESTED LOOPS的JOIN方式。

于是,我写一个更简单的SQL来验证一下。

DATA: GT_AFKO TYPE TABLE OF AFKO.

SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_AFKO

FROM AUFK INNER JOIN AFKO ON AFKO~AUFNR = AUFK~AUFNR

WHERE PSPEL = '00000001'.

然后ST05查看其执行计划,如下图:

果然,是NESTED LOOPS。

于是我继续加一个hints来干预执行计划,如下:

指定这两个表通过NESTED LOOP的方式关联。

【更多关于use_nl和use_hash的用法,请自行谷歌百度】

再次跟踪SQL执行计划,得到结果如图:

(12/12)最后


我尝试换了一些别的系统,执行同样的最初的SQL(不加HINTS的),SQL执行计划各不相同。所以本文仅是针对特定数据库环境下的特殊结果,进行的执行计划分析与执行计划优化,供猿们探讨交流。



©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容