在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里使用各种工具分析该语句时,也要保证也使用绑定变量的方式执行。

看个具体的例子。在SAP CRM里,我写了下列一个简单的report,来搜索其抬头的描述字段包含了指定输入的关键字的那些服务订单。

这段代码调用BOL的API dquery实现数据库查询,最后会执行如下的OPEN SQL。

可以看到OPEN SQL的where语句里的条件都是运行期动态计算填充的,在编译期不可见。这属于上文介绍的第二种执行方式:绑定变量。

因此,如果我们想将对应的SQL语句在HANA Studio里执行以便利用那里各种有用的性能分析工具,我们要注意需要用正确的方式把SQL粘贴到HANA Studio里。

错误的做法

从Edit->Display Execution Plan->For Recorded Statement找到需要粘贴的statement:

如果把下面这段红色的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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

使用字面量或者绑定变量在HANA Studio里执行SQL语句的更多相关文章

  1. sp_executesql动态执行sql语句并将结果赋值给一变量

    需求场景: 需动态拼接sql语句进行执行,并将执行的结果赋值给一指定变量. 样例代码如下: SELECT @tableName = TAB_NAME FROM dbo.NMR_BLYWBDY WHER ...

  2. SQL内部拼接执行SQL语句时,实现变量参数化

    exec sp_ExecuteSql执行的SQL语句拼接起是比较麻烦,如果关联的表多拼接过程是很容易出错的,下面这方法非常的好用,而且简单直观 if exists(select * from syso ...

  3. [转]ORACLE 绑定变量用法总结

    转:http://blog.csdn.net/wanghai__/article/details/4778343 在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析 ...

  4. ORACLE 绑定变量用法总结 .

    之前对ORACLE中的变量一直没个太清楚的认识,比如说使用:.&.&&.DEIFINE.VARIABLE……等等.今天正好闲下来,上网搜了搜相关的文章,汇总了一下,贴在这里,方 ...

  5. Oracle绑定变量在C#.NET中的应用及意义

    一. 什么是绑定变量 绑定变量(bind variable) : select * from emp where empno=:empno; 是用户放入查询中的占位符,它会告诉Oracle“我会随后为 ...

  6. SQL优化 | Oracle 绑定变量

    之前整理过一篇有关绑定变量的文章,不太详细,重新补充一下. Oracle 绑定变量 http://www.cndba.cn/Dave/article/1275 一.绑定变量 bind variable ...

  7. 什么是javascript字面量,常量,变量,直接量?

    1.字面量是变量的字符串表示形式.它不是一种值,而是一种变量记法. var a = 1 //1是字面量 var b = 'css' //css是字面量 var c = [5,6,7] //567是字面 ...

  8. JS基础_字面量和变量

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. JS基础二--字面量和变量

       /*       字面量,都是一些不可改变的值,       比如:1 2 3 4 5       字面量都是可以直接使用,但是我们一般不会直接使用字面量.       变量,变量可以用来保存字 ...

随机推荐

  1. C++ GUI Qt4编程(12)-6.1FindFileDialog

    1. 主要介绍了QGridLayout, QHBoxLayout, QVBoxLayout3种布局管理器的使用方法. 2. 在linux中,继承自QDialog的对话框,没有最大化.最小化.关闭按钮, ...

  2. Oracle 查看表结构视图

    -- 创建视图 CREATE VIEW VIEW_TABLEASSELECT A.TABLE_NAME, A.column_name 字段名,A.data_type 数据类型,A.data_lengt ...

  3. <?>与<T>的区别

    ?是通配符(占位符),可以表示任意一个,T只是一种替代,只能表示其中一个 假设有A,B,C三个类 <?>可以是A,B,C任意一个,每一个<?>之间没有关联 <T>如 ...

  4. GreenPlum 大数据平台--分区表(二)

    01,创建分区表 [PARTITION BY partition_type (column) [SUBPARTITION BY partition_type (column)] [SUBPARTITI ...

  5. nodejs基础知识查缺补漏

    1. 单线程.异步I/O.对比php nodejs是单线程的,但是是异步I/O,对于高并发时,它也能够快速的处理请求,100万个请求也可以承担,但是缺点是非常的耗内存,但是我们可以加大内存, 所以能用 ...

  6. java连接redis使用jedis带密码

    一.引入jedis的Maven配置文件 <!-- redis连接客户端jedis --> <dependency> <groupId>redis.clients&l ...

  7. Ant利用第三方的task

    转自 http://blog.sina.com.cn/s/blog_3d21e545010006s9.html 一.如何使用第三方任务   Ant可以使用第三方任务,在使用第三方任务之前,需告知Ant ...

  8. Fragment、Activity比较——Android碎片介绍

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragmen ...

  9. unity监听键盘按键

    放在Update里面 if (Input.anyKeyDown) { foreach (KeyCode keyCode in Enum.GetValues(typeof(KeyCode))) { if ...

  10. pat1011. World Cup Betting (20)

    1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Wit ...