在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. Hibernate处理一个实体映射多张相同结构的数据表--动态映射

    [转自] http://blog.csdn.net/majian_1987/article/details/8725197 LZ在项目中需要处理这样一个业务,每天都有终端设备上传GPS位置信息到服务端 ...

  2. 尺取法 javascript算法

    给定长度为n的数列整数a0,a1……an-1 以及整数S.求出总和不小于S的连续子序列的长度的最小值.如果解不存在,则输出0. 输入 n=10 S=15 a=[5,1,3,5,10,7,4,9,2,8 ...

  3. 解决nginx文件服务器访问403

    2018-10-24 nginx配置文件目录服务器 修改/etc/nginx/conf.d/default.conf或者在/etc/nginx/conf.d/目录下添加一配置文件,如下 server ...

  4. 01-oracle限定查询-20190404

    关系型数据库和半结构化数据(xml文件) oracle12c:c代表云计算 PDB,CDB sql语句执行顺序: 第一步:from子句控制数据来源: 第二步:where子句使用限定符对数据行过滤: 第 ...

  5. jackson工具类有动态属性过虑功能

    在业务应用中经常会有指定属性序列化json的需求,C#中这个功能很容易就可以解决:使用lambda重新构造一下匿名对象就可以了.一行代码搞定.java是这样解决的. public JsonMapper ...

  6. HDFS基本工具类的实现

    package com.shikun.HdfsTool;import java.io.File;import java.io.IOException;import java.net.URI;impor ...

  7. (转)[Shell]tr命令详解

    原文:http://blog.csdn.net/sunnyyoona/article/details/52986893 1. 用途 tr,translate的简写,主要用于压缩重复字符,删除文件中的控 ...

  8. vue中watch的使用

    vue中watch的使用 vue中的watch是一个比较重要的概念,通过他我们可以检测data的变化,下面进行详细的介绍. watch定义方式如下: {[key: string]: string | ...

  9. Eclipse设置JVM的内存参数

    打开Eclipse 或者 MyEclipse 打开 Windows -> Preferences -> Java -> Installed JREs 选中你所使用的 JDK,然后点击 ...

  10. MATLAB-R2015b-win64安装详细教程

    1.首先下载以下文件 链接:https://pan.baidu.com/s/1eRAOKZw 密码:5nkj 2.双击R2015b_win64.iso打开(win8,win8.1,win10均可直接打 ...