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

  1. 这段代码由两段非常复杂的SQL 查询语句组成。两段语句绝大部分都相同,除了下图的四处。从clean code角度出发,这是dplication。但是由于这里用到的是OPEN SQL,无法把common的部分抽成方法,因为OPEN SQL里的JOIN不支持把table name dynamic 传进去。

  1. 就我的理解,crm_jest_和crm_jsto都是client dependent的表,因此不需要通过CLIENT SPECIFIED显式指定client。

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

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

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,

就是ABAP help 里提到的outer join:

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

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

(1) 尽量避免nested select statement

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

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

然后I1004改成released吧:

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

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

所以我在想我们有时间的话,能不能先考虑准备另一套方案,就是先设法把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万条数据了。

当然这样做的话要花点时间。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

一个ABAP重构的实例:CL_CRM_LEAD_CREATE~SELECT_CAMPAIGNS_BY_SQL相关推荐

  1. SAP abap alv报表实例

    这是一个sap alv报表实例 REPORT ztest005.*定义类型组 TYPE-POOLS: abap,slis.*定义ALV变量 DATA : lt_fieldcat TYPE slis_t ...

  2. php 返回一个json对象,PHP给前端返回一个JSON对象的实例讲解

    解决问题:用php做后台时,如何给前端发起的AJAX请求返回一个JSON格式的"对象": 说明:我本身是一个前端,工作久了之后发现要是不掌握一门后端开发语言的话,总感觉有点无力.最 ...

  3. python生成一个窗口_PyQt5创建一个新窗口的实例

    更多python教程请到友情连接: 菜鸟教程www.piaodoo.com 人人影视www.sfkyty.com 飞卢小说网www.591319.com 韩剧网www.op-kg.com 兴化论坛ww ...

  4. 用python写搜索引擎_用python做一个搜索引擎(Pylucene)的实例代码

    1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...

  5. 在哪里能收到python实例代码-用python做一个搜索引擎(Pylucene)的实例代码

    1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...

  6. python写一个游戏多少代码-使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...

  7. python游戏脚本实例-使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...

  8. Java Tread多线程(0)一个简单的多线程实例

    作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...

  9. 如何根据一个ABAP类方法的名称反差到类名称

    假设你想查找一个ABAP class, 但是你只记住了它的某个method name,想通过method name反查到ABAP class name.例如你想查看所有实现了get_instance的 ...

最新文章

  1. 分布式系统概述(来自学习资料)
  2. 至强cpu型号列表_装机必看——CPU型号参数详解
  3. myVariable是java标识符吗_java 标识符与变量
  4. 天天向上续python3.3_Linux 配置系列 四 python3
  5. ffmpeg 拼接mp4_ffmpeg 合并 拼接 mp4视频
  6. 如何在Android上使背景20%透明
  7. Nginx作为web服务器的安装配置
  8. 台大李宏毅Machine Learning 2017Fall学习笔记 (3)Bias and Variance (v2)
  9. 链表常见操作java实现二:反转链表,从尾到头倒序遍历
  10. 22个HTML5和CSS3表单教程
  11. html的实习报告,HTML实习报告
  12. java 假币问题_假币问题-题解(Java代码)
  13. IM即时通讯-项目框架搭建(二)
  14. 第三方百度地图-----展示所在位置显示小圆点
  15. 学日语小技巧 让Office Word效劳
  16. 大华DSS视频综合应用平台webservice接口使用手册-php测试用例
  17. address localhost:8080 is already in use(端口被占用)Windows系统问题解决
  18. spring boot 集成xxl-job 学习总结
  19. Java—ISBN号码问题
  20. 聊聊Dubbox(一):为何选择

热门文章

  1. 进入“0”和“1”的世界
  2. 如何在html 中引入其它html文件
  3. JavaDoc命令使用说明
  4. mysql5.6优化建议
  5. input中radio用法
  6. 【设计】精致的侧滑菜单设计案例
  7. 将文件中的参数读取成Map
  8. 机器学习面试题(part4)
  9. R语言与总体比例的置信区间
  10. 利用python爬虫(part9)--Xpath与谓词の爱