在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. dedecmd 全局标签

    dedecms全局标签     dedecms 标签使用手册  全局标签   adminname|责任编辑   arclist|文档列表   arclistsg|独立单表模型列表   ask|问答标签 ...

  2. [转] javascript中的变量和垃圾回收

    [From] http://www.imooc.com/article/4585 基本类型和引用类型 js中的变量虽然不区分类型,但是实际上Ecmascript包含两种类型,基本类型和引用类型. 基本 ...

  3. Ubuntu下apt-get安装Java,Tomcat

    sudo apt-get update sudo add-apt-repository ppa:webupd8team/java sudo apt-get install oracle-java8-i ...

  4. PIE SDK图像镜像

      1.算法功能简介 图像镜像可生成图像的水平镜像.垂直镜像和水平垂直镜像.水平镜像是图像以垂直中线为轴, 将图像左右半部对调:垂直镜像是图像以水平中线为轴,将图像上下半部对调. PIE支持算法功能的 ...

  5. 从零开始学Linux(11)--more

    more命令,是将文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空格键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还 ...

  6. 【转】python平台libsvm安装

    来源:http://blog.csdn.net/prom1201/article/details/51382358 网上有很多麻烦的在win64机器上安装libsvm的步骤,实际上只要在下面网站找到l ...

  7. jquery:字符串(string)转json

    第一种方式: 使用js函数eval(); testJson=eval(testJson);是错误的转换方式. 正确的转换方式需要加(): testJson = eval("(" + ...

  8. [转]微信小程序安全浅析

    本文转自:http://blog.csdn.net/baize_security/article/details/54582854 引言 近期微信小程序重磅发布,在互联网界掀起不小的波澜,已有许多公司 ...

  9. [转]Wrapping multiple calls to SaveChanges() in a single transaction

    本文转自:http://www.binaryintellect.net/articles/165bb877-27ee-4efa-9fa3-40cd0cf69e49.aspx When you make ...

  10. javaweb九大个内置对象,四大域

    9个内置对象如下: 1.session对象:会话对象 当客户端第一次访问服务器的页面时,web服务器会自动为该客户端创建一个session对象并分配一个唯一的id号 常常用它来在多个页面间共享数据,如 ...