在SAP note 2000002 – FAQ: SAP HANA SQL Optimization里提到了SQL语句的两种执行方式,具体差别体如今where语句里搜索条件的指定方式上。数据库
所谓Literals, 就是咱们一般所说的hard code – 硬编码,在下面的例子里已经写得很清楚了。 工具
而Bind variables – 绑定变量, 就是指在出如今SQL语句的where条件是维护在变量里,这些变量的值根据应用程序的逻辑计算出来。一个典型的例子以下: 性能
关于这两种执行方式,SAP note里有这样的提示:测试
It can make a significant difference in terms of execution plan, performance and resource consumption if a SQL statement is executed with explicit literals or with bind variables. Therefore it is recommended that you analyze an expensive SQL statement that uses bind variables in the same way, i.e. also with bind variables.编码
大意是说: 这两种执行方式会影响执行计划, 性能和运行时的资源消耗。所以SAP建议,若是您在分析一个存在性能问题的ABAP OPEN SQL时,若是该ABAP OPEN SQL是经过绑定变量的方式执行,那么,您在HANA Studio里使用各类工具分析该语句时,也要保证也使用绑定变量的方式执行。code
看个具体的例子。在SAP CRM里,我写了下列一个简单的report,来搜索其抬头的描述字段包含了指定输入的关键字的那些服务订单。 orm
这段代码调用BOL的API dquery实现数据库查询,最后会执行以下的OPEN SQL。 ci
能够看到OPEN SQL的where语句里的条件都是运行期动态计算填充的,在编译期不可见。这属于上文介绍的第二种执行方式:绑定变量。资源
所以,若是咱们想将对应的SQL语句在HANA Studio里执行以便利用那里各类有用的性能分析工具,咱们要注意须要用正确的方式把SQL粘贴到HANA Studio里。字符串
错误的作法
若是把下面这段红色的SQL语句粘贴到HANA Studio里执行,那就没可以彻底模拟个人测试report执行的ABAP Open SQL,由于这里粘贴的SQL的where语句已经被转换成字面量方式了(下图蓝色区域),而个人ABAP Open SQL的where语句从上图介绍来看是经过绑定变量来执行的。根据SAP note,这二者不等价。
正确的作法
把下面这段SQL粘贴到HANA Studio里。注意蓝色区域的绑定变量的风格,和”错误的作法”里的字面量风格相比较。
把SQL statement粘贴到HANA Studio里,执行,能看到下列这个tab: Prepared SQL。右键,选择Add Parameter Values。
输入下列字符串: 504,BUS2000116,BUS2000116,BUS2000140,BUS2000105,BUS2000137,BUS2000131,BUS2000146,BUS2000159,BUS2000153,BUS2000199,,Y,,%2017-12-21%,SRVO,100
这些值即被自动填充到SQL语句where条件对应的绑定变量里。
执行SQL,获得结果。经过这种方式在HANA Studio里执行SQL语句才能真正保证和我在SAPGUI里执行ABAP report进而执行的SQL语句性能彻底一致。
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码: