在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. 【研究】Discuz<3.4任意文件删除漏洞

    这里以Discuz3.2为例 关键字:Powered by Discuz! X3.2 时间有限,就不一一截图了,Discuz所有页面全在Discuz_X3.2_SC_UTF8/upload/目录下 利 ...

  2. python re模块 collections模块

    根据手机号码一共11位并且是只以13.14.15.18开头的数字这些特点,我们用python写了如下代码: while True: phone_number = input('please input ...

  3. 剑指offer——面试题11:快速排序

    #include"iostream" #include"random" using namespace std; /* void Swap(int &a ...

  4. 《UML和模式应用(原书第3版)》目录

    学习 <UML和模式应用(原书第3版)>目标: 理解OOA/D思想 如何使用UML建模 如何使用设计模式 如何设计分层架构 目录: 第1部分 绪论 第1章 面向对象分析和设计 第2章 迭代 ...

  5. 将libFM模型变换成tensorflow可serving的形式

    fm_model是libFM生成的模型 model.ckpt是可以tensorflow serving的模型结构 亲测输出正确. 代码: import tensorflow as tf # libFM ...

  6. Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本

    Android Runtime使得直接调用底层Linux下的可执行程序或脚本成为可能 比如Linux下写个测试工具,直接编译后apk中通过Runtime来调用 或者写个脚本,apk中直接调用,省去中间 ...

  7. Python 的 __new__()方法与实例化

    __new__() 是新式类中才有的方法,它执行在构造方法创建实例之前.可以这么理解,在 Python 中类中的构造方法 __init__() 负责将类实例化,而在 __init__() 启动之前,_ ...

  8. Java变量类型,实例变量 与局部变量 静态变量

    实例变量: 实例变量在类中声明,但在方法的外面,构造函数或任何块. 当空间分配给某个对象在堆中,插槽为每个实例变量创建值. 当一个对象与使用关键字 “new” 来创建,在对象被销毁销毁创建的实例变量. ...

  9. Go语言下载网络图片或文件

    最近闲来无事, 于是就简单学习了下Go语言的基本的用法.由于实践才是最快的学习方法,所以这里就以下载网络图片或文件入手来学习Go语言 文件下载到本地,通常的思路就是先获得网络文件的 输入流 以及本地文 ...

  10. VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。

    首先,这是个历史遗留问题,说起来比较复杂.其次,这个问题在微软的MSDN博客上已经专门被说起过了,英文好的请直接移步到原文:<VC++ Directories>.另外,stack over ...