前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个ABAP重构的实例:CL_CRM_LEAD_CREATE~SELECT_CAMPAIGNS_BY_SQL

一个ABAP重构的实例:CL_CRM_LEAD_CREATE~SELECT_CAMPAIGNS_BY_SQL

作者头像
Jerry Wang
发布2019-11-08 10:14:08
4870
发布2019-11-08 10:14:08
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://jerry.blog.csdn.net/article/details/102949098

Created by Wang, Jerry, last modified on Nov 12, 2015

  1. 这段代码由两段非常复杂的SQL 查询语句组成。两段语句绝大部分都相同,除了下图的四处。从clean code角度出发,这是dplication。但是由于这里用到的是OPEN SQL,无法把common的部分抽成方法,因为OPEN SQL里的JOIN不支持把table name dynamic 传进去。
clipboard1
clipboard1
  1. 就我的理解,crm_jest_和crm_jsto都是client dependent的表,因此不需要通过CLIENT SPECIFIED显式指定client。

按照SCN上的说法,指定client和不指定,对性能无任何影响。

clipboard2
clipboard2
  1. 我觉的这个IS NULL可以去掉。
clipboard3
clipboard3

ABAP help上说的很清楚:

Please note that the NULL value is inserted only for the existing records, by the time the new field is being inserted. For all new records, SPACE or the initial (default) value is inserted. If the new field is inserted by checking the checkbox “initial values”, then the initial values (SPACE in case of characters) are automatically inserted and not the NULL values.

而且这个field的initial已经勾上了,因此唯一可能让IS NULL返回true的condition,

clipboard4
clipboard4

就是ABAP help 里提到的outer join:

clipboard5
clipboard5

但是我看了下source code里的OPEN SQL,里面的操作应该不会造成template field为NULL的结果,所以我觉得这个检查可以删除。

  1. 这个ABAP open SQL do’s and don’ts 里说

(1) 尽量避免nested select statement

clipboard6
clipboard6

(2) 尽量避免复杂的where语句,否则database optimizer没法做优化。我们这个代码里的where语句里又套了嵌套的select,应该算是complex了。

clipboard7
clipboard7
  1. 这个还是改成常量space吧:
clipboard8
clipboard8

然后I1004改成released吧:

clipboard9
clipboard9
  1. AG3和QHD都是HANA DB了,即使我们的代码在上面跑的很快,但是也不能排除如果在客户的Non HANA DB比如max DB上跑效果如何。一个典型的例子就是ERCO的account search in my appointment,BP底层的SQL是动态生成的,在我们自己的系统上一直没有遇到过性能问题,这个incident 6月份就报了,到现在BP都没解决。
clipboard10
clipboard10

最后DB expert分析得出结论现在的SQL 语句在MaxDB下需要重写。

clipboard11
clipboard11

所以我在想我们有时间的话,能不能先考虑准备另一套方案,就是先设法把where里的nested select去掉,可以换成用多个select顺序执行的方式,最后简单测试下两个solution的性能。

我去年做联想的性能评测就是在AG3上做的:

  1. 把SQL里所有涉及到的表全部copy一个Z的出来,创建两个report,把两种solution的SQL 语句贴到report里,当然table name也要全部换成Z的
  2. 在AG3上写一个report,把每个Z表的每一条数据, 根据需要分别复制一个倍数。比如CRM_MKTPL_ATTR现在有100条,我把每条复制1000次,每次复制的时候重新生成新的guid,其他数据都不变,这样复制完后我就得到10万条数据了。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Created by Wang, Jerry, last modified on Nov 12, 2015
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档