Oracle 变量绑定与变量窥视合集系列一

Oracle 变量绑定与变量窥视合集》

数据库环境

LEO1@LEO1> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production


 

 用示例说明绑定变量的应用领域是OLTP而不是OLAP

变量绑定:这是一个老生常谈的话题,我所理解的绑定就是执行计划的绑定,我所理解的变量就是谓词替换的变量。

变量绑定机制:要说机制不得不说一下SQL执行的过程,三部曲:解析 –> 执行 -> 取操作,而绑定变量就发生在解析这一步,而解析又分成硬解析和软解析。

硬解析:当一条SQL语句第一次执行时,首先生成执行计划,并把这个执行计划存放到shared_pool的library cache中,这个过程叫做硬解析。

软解析:如果SQL语句已经被硬解析过了,那么可以直接从library cache中抽取现成的执行计划来重用,这个过程叫做软解析,目的减少生成执行计划这方面的资源消耗。为什么这么说呢,硬解析会消耗一些系统资源,尤其是CPU的资源,从而影响系统的效率,如果能把这方面的影响消除,那么对系统当然是多多益善了,哈 多侃了几句。

SQL详细执行过程:当oracle接收到一条sql语句时,首先会把这条sql语句字符做成哈希值,然后到library cache中寻找是否有和这个哈希值相匹配的sql存在,如果有就直接使用这个sql的执行计划去执行当前的sql语句,最后将结果返回给用户。如果没有找到相同的哈希值,oracle会认为这是一条新的sql,将会重新生成执行计划来执行(在这个过程中先要检查语法分析和语义分析),最后将结果返回给用户。

实验

下面我们演示一下绑定变量和非绑定变量在资源消耗上的差异

LEO1@LEO1> drop table leo1 purge;                清理环境

Table dropped.

LEO1@LEO1> drop table leo2 purge;               

Table dropped.

LEO1@LEO1> create table leo1 as select * from dba_objects;    创建leo1

Table created.

LEO1@LEO1> create table leo2 as select * from dba_objects;    创建leo2

Table created.

LEO1@LEO1> alter session set tracefile_identifier='bind_variable';    设置trace文件标识

Session altered.

LEO1@LEO1> alter session set sql_trace=true;      启动trace功能,追踪sql资源消耗情况

Session altered.

LEO1@LEO1> begin

for i in 1..100 loop

execute immediate 'select * from leo1 where object_id=:i' using i;

end loop;

end;

/

PL/SQL procedure successfully completed.

我们对一条sql执行了100次并采用了绑定变量技术,oracle对这条sql只有一次硬解析,没有软解析,反复执行100次。

LEO1@LEO1> alter session set sql_trace=false;           关闭trace功能

Session altered.

LEO1@LEO1> select sql_text,parse_calls,loads,executions from v$sql where sql_text like 'select * from leo1 where %';

SQL_TEXT                             PARSE_CALLS  LOADS   EXECUTIONS

-------------------------------------------------- ----------- -------------------------- ----------- ---------- ------------------

select * from leo1 where object_id=:i         1          1        100

SQL_TEXT:我们跟踪的sql语句

PARSE_CALLS:硬解析+软解析次数       1次   只有硬解析没有软解析

LOADS:硬解析次数                    1次

EXECUTIONS:执行次数                 100次

虽说值隐藏在变量中,但在解析环节oracle认为是一样的

[oracle@leonarding1 trace]$ tkprof LEO1_ora_16433_bind_variable.trc bind_variable.txt sys=no

TKPROF: Release 11.2.0.1.0 - Development on Fri Feb 1 13:18:08 2013

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

使用tkprof工具过滤和汇总trace文件的,sys=no 不输出sys用户递归语句,默认yes,实际上设置成no更具有可读性

--------- 下面是bind_variable.txt文件信息

********************************************************************************

SQL ID: 0b74y9utb0b6r             #这就是SQL语句字符的哈希值

Plan Hash: 2716644435

select *

from

leo1 where object_id=:i

call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.00       0.00          0          0          0           0

Execute    100      0.01       0.01          0          1          0           0

Fetch        0      0.00       0.00          0          0          0           0

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total      101      0.01       0.01          0          1          0           0

Misses in library cache during parse: 1        只有1次硬解析,反复执行100次

Optimizer mode: ALL_ROWS

Parsing user id: 85     (recursive depth: 1)

Rows     Row Source Operation

-------  ---------------------------------------------------

      0  TABLE ACCESS FULL LEO1 (cr=0 pr=0 pw=0 time=0 us cost=288 size=2484 card=12)

********************************************************************************

下面是一个非绑定变量的sql执行情况

LEO1@LEO1> alter session set sql_trace=true;              启动trace功能

Session altered.

LEO1@LEO1> begin

for i in 1..100 loop

execute immediate 'select * from leo2 where object_id='||i;

end loop;

end;

/

PL/SQL procedure successfully completed.

我们对一条sql执行了100次没有采用绑定变量技术,oracle对这条sql要硬解析100次,执行100次,资源严重被sql解析所消耗,系统显得缓慢不堪。

LEO1@LEO1> alter session set sql_trace=false;             关闭trace功能

Session altered.

LEO1@LEO1> select sql_text,parse_calls,loads,executions from v$sql where sql_text like 'select * from leo2 where %' order by 1;

SQL_TEXT                                           PARSE_CALLS      LOADS EXECUTIONS

-------------------------------------------------- ----------- ---------- ----------

select * from leo2 where object_id=1                         1          1          1

select * from leo2 where object_id=10                        1          1          1

select * from leo2 where object_id=100                       1          1          1

select * from leo2 where object_id=11                        1          1          1

select * from leo2 where object_id=12                        1          1          1

select * from leo2 where object_id=13                        1          1          1

select * from leo2 where object_id=14                        1          1          1

select * from leo2 where object_id=15                        1          1          1

select * from leo2 where object_id=16                        1          1          1

select * from leo2 where object_id=17                        1          1          1

select * from leo2 where object_id=18                        1          1          1

select * from leo2 where object_id=19                        1          1          1

select * from leo2 where object_id=2                         1          1          1

select * from leo2 where object_id=20                        1          1          1

select * from leo2 where object_id=21                        1          1          1

select * from leo2 where object_id=22                        1          1          1

select * from leo2 where object_id=23                        1          1          1

select * from leo2 where object_id=24                        1          1          1

select * from leo2 where object_id=25                        1          1          1

select * from leo2 where object_id=26                        1          1          1

select * from leo2 where object_id=27                        1          1          1

select * from leo2 where object_id=28                        1          1          1

select * from leo2 where object_id=29                        1          1          1

select * from leo2 where object_id=3                         1          1          1

select * from leo2 where object_id=30                        1          1          1

select * from leo2 where object_id=31                        1          1          1

select * from leo2 where object_id=32                        1          1          1

select * from leo2 where object_id=33                        1          1          1

select * from leo2 where object_id=34                        1          1          1

select * from leo2 where object_id=35                        1          1          1

select * from leo2 where object_id=36                        1          1          1

select * from leo2 where object_id=37                        1          1          1

select * from leo2 where object_id=38                        1          1          1

select * from leo2 where object_id=39                        1          1          1

select * from leo2 where object_id=4                         1          1          1

select * from leo2 where object_id=40                        1          1          1

select * from leo2 where object_id=41                        1          1          1

select * from leo2 where object_id=42                        1          1          1

select * from leo2 where object_id=43                        1          1          1

select * from leo2 where object_id=44                        1          1          1

select * from leo2 where object_id=45                        1          1          1

select * from leo2 where object_id=46                        1          1          1

select * from leo2 where object_id=47                        1          1          1

select * from leo2 where object_id=48                        1          1          1

select * from leo2 where object_id=49                        1          1          1

select * from leo2 where object_id=5                         1          1          1

select * from leo2 where object_id=50                        1          1          1

select * from leo2 where object_id=51                        1          1          1

select * from leo2 where object_id=52                        1          1          1

select * from leo2 where object_id=53                        1          1          1

select * from leo2 where object_id=54                        1          1          1

select * from leo2 where object_id=55                        1          1          1

select * from leo2 where object_id=56                        1          1          1

select * from leo2 where object_id=57                        1          1          1

select * from leo2 where object_id=58                        1          1          1

select * from leo2 where object_id=59                        1          1          1

select * from leo2 where object_id=6                         1          1          1

select * from leo2 where object_id=60                        1          1          1

select * from leo2 where object_id=61                        1          1          1

select * from leo2 where object_id=62                        1          1          1

select * from leo2 where object_id=63                        1          1          1

select * from leo2 where object_id=64                        1          1          1

select * from leo2 where object_id=65                        1          1          1

select * from leo2 where object_id=66                        1          1          1

select * from leo2 where object_id=67                        1          1          1

select * from leo2 where object_id=68                        1          1          1

select * from leo2 where object_id=69                        1          1          1

select * from leo2 where object_id=7                         1          1          1

select * from leo2 where object_id=70                        1          1          1

select * from leo2 where object_id=71                        1          1          1

select * from leo2 where object_id=72                        1          1          1

select * from leo2 where object_id=73                        1          1          1

select * from leo2 where object_id=74                        1          1          1

select * from leo2 where object_id=75                        1          1          1

select * from leo2 where object_id=76                        1          1          1

select * from leo2 where object_id=77                        1          1          1

select * from leo2 where object_id=78                        1          1          1

select * from leo2 where object_id=79                        1          1          1

select * from leo2 where object_id=8                         1          1          1

select * from leo2 where object_id=80                        1          1          1

select * from leo2 where object_id=81                        1          1          1

select * from leo2 where object_id=82                        1          1          1

select * from leo2 where object_id=83                        1          1          1

select * from leo2 where object_id=84                        1          1          1

select * from leo2 where object_id=85                        1          1          1

select * from leo2 where object_id=86                        1          1          1

select * from leo2 where object_id=87                        1          1          1

select * from leo2 where object_id=88                        1          1          1

select * from leo2 where object_id=89                        1          1          1

select * from leo2 where object_id=9                         1          1          1

select * from leo2 where object_id=90                        1          1          1

select * from leo2 where object_id=91                        1          1          1

select * from leo2 where object_id=92                        1          1          1

select * from leo2 where object_id=93                        1          1          1

select * from leo2 where object_id=94                        1          1          1

select * from leo2 where object_id=95                        1          1          1

select * from leo2 where object_id=96                        1          1          1

select * from leo2 where object_id=97                        1          1          1

select * from leo2 where object_id=98                        1          1          1

select * from leo2 where object_id=99                        1          1          1

100 rows selected.

我们从动态性能视图上可以看出oracle每执行一次sql,都要先硬解析1次之后在执行。这种没有使用绑定变量技术在硬解析消耗上就比使用绑定变量技术多损耗100倍,如果执行的次数上万 上亿对系统性能的影响可想而知。

--------- 我们来看看trace文件的内容

[oracle@leonarding1 trace]$ tkprof LEO1_ora_16433_bind_variable.trc bind_variable.txt sys=no

TKPROF: Release 11.2.0.1.0 - Development on Fri Feb 1 13:49:52 2013

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

********************************************************************************

SQL ID: 22r47f3t6w0td

Plan Hash: 2258638698

select *

from

leo2 where object_id=1

call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.00       0.00          0          1          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch        0      0.00       0.00          0          0          0           0

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        2      0.00       0.00          0          1          0           0

Misses in library cache during parse: 1

Optimizer mode: ALL_ROWS

Parsing user id: 85     (recursive depth: 1)

Rows     Row Source Operation

-------  ---------------------------------------------------

      0  TABLE ACCESS FULL LEO2 (cr=0 pr=0 pw=0 time=0 us cost=288 size=2484 card=12)

********************************************************************************

SQL ID: 9nb3n54fy0z8m

Plan Hash: 2258638698

select *

from

leo2 where object_id=2

********************************************************************************

SQL ID: 8mc705qymd7qs

Plan Hash: 2258638698

select *

from

leo2 where object_id=3

如上所示每个sql语句的SQL_ID都是不一样的,都是相对独立的,因此每执行1次就要解析1次,两种情况对比结果显示,绑定变量要比没有绑定变量消耗的资源少的少,sql执行的次数越多,这种效果越明显。所以我们说绑定变量本质就是用一个变量来代替谓词常量,让oracle只需要硬解析一次,后续sql都直接使用之前执行计划来执行,这样就省却了很消耗资源的硬解析过程

下面讨论绑定变量为什么适合于OLTP而不是OLAP

OLTP

1.适合OLTP系统架构

2.SQL简单非常相似,结果集非常小,例如 只有谓词部分不同,余下部分全部相同的SQL语句,这种情况下执行计划都是一样的,在执行计划几乎不变的情况下,oracle使用变量来代替谓词常量,使用同一个执行计划是非常合理的

3.SQL重复率很高,或者只有谓词条件不同而已

4.DML操作频繁

5.SQL语句执行条数多,条数越多减少硬解析越有意义

6.基于主键做查询,还有等值查询,唯一性查询,这类查询相对适合绑定变量

select   *   from  leonarding   where   id=:leo;

 

OLAP

1.不适合OLAP系统架构

2.SQL的执行计划多变,会因为值的不同导致执行计划的不同,可能第一次执行是一种执行计划,第二次执行是另一种执行计划,所以不适合进行绑定变量操作,会让oracle盲目浪费大量资源消耗,SQL语句即使只有谓词条件不同,oracle应然可能采取不同的执行计划。

3.SQL重复率较低,大部分都是批量加载批量检索的操作

4.数据聚合操作频繁

5.SQL语句执行条数少,SQL硬解析对系统性能影响较小,绑定没有意义

6.分区表相对不太适合绑定变量技术


 本文转自 leonarding151CTO博客,原文链接:http://blog.51cto.com/leonarding/1131507,如需转载请自行联系原作者


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(原创)对某国的一次渗透

文章均由自己原创,只是一直没有在自己博客发表。本地附件也没有了,我是从网上找来我的以前的投稿。 写在之前的废话:小菜技术能力不行,如果你觉得此文实在看不下去,还请PASS掉。如果你对我的文章有兴趣,可以…

matlab常用函数——方程函数

八、插值函数、线性方程解函数和多项式函数 1)插值函数 interp1q :1维快速线性插值法 yi=interp1q(x,Y,xi) interp1q正常执行条件: (1)x单调递增列向量 (2)Y为列向量or行数为length(x)(3)xi为列向量,如果xi值在x的坐标范围外,返回NaN 实例: x=(-5:0.5:5); y=sin…

C/C++ | 字节对齐

目的:优化CPU访问数据效率 类型转换:未对齐时,严格一些的系统会报段错误,未报错的话效率也会有所下降。 各种结构的对齐: 编译器的区别: 其实字节对齐的细节和具体编译器实现相关,但一般而言&am…

关于python测试webservice接口的视频分享

现在大公司非常流行用python做产品的测试框架,还有对于一些快速原型产品的开发也好,很好地支持OO编程,代码易读。 Python的更新挺快的,尤其是第三方库。 对于测试人员,代码基础薄弱,用python语言容易上手。…

matlab常用函数——文件操作函数

十一、基本文件操作函数 1)文件创建函数 filemaker :把文件名与文件中函数名分开 。 filesep :文件目录分隔。 fileparts :把目标文件名拆分成字符串形式输出 。 tempdir :返回系统暂存地址名 。 tempname :返回系统暂存文件名 。 fullfile :创建文件名 2)文件打…

Struts2中文件上传下载实例

1.单文件上传 1 jsp页面&#xff1a;2 3 <!-- 单文件上传 -->4 <form action"Fileupload.action" method"post"5 enctype"multipart/form-data">6 username:7 <input type"tex…

最优化课堂笔记06-无约束多维非线性规划方法(续)

6.5共轭方向法 6.5.1 共轭方向 6.5.1 共轭梯度法 6.6单纯形法(不考) 6.7最小二乘法 6.7.2 改进的高斯-牛顿最小二乘法

opengl微发展理解

1.什么是OpenGL? 一种程序&#xff0c;可以与界面和图形硬件交互作用、一个开放的标准 2.软件管道 请看上图 - Apllication层 表示你的程序&#xff08;调用渲染命令。如opengl API&#xff09; -Abstraction层 表示画图接口&#xff08;如OpenGL API或者DirectX API&a…

MacosX 下GCC编译指定版本的代码

export MACOSX_DEPLOYMENT_TARGET10.6转载于:https://www.cnblogs.com/lovelylife/p/5754226.html

最优化作业第六章——共轭梯度法和鲍尔法

共轭梯度法&#xff1a; 代码&#xff1a; #导入模块 from sympy import * import sympy as sp #将导入的模块重新定义一个名字以便后续的程序进行使用 from numpy import * import numpy as npdef main():#本例是利用共轭梯度法进行最优化x1,x2,alpha symbols("x1,x2,…

酒鬼随机漫步(一个矢量类)

摘要: 阅读全文这是一个定义的一个矢量类&#xff0c; 然后用矢量类模拟一个酒鬼的随机漫步 问题很简单&#xff0c; 实现也不麻烦&#xff0c; 但是这个小程序却可以呈现出许多语法知识。而且代码风格也不错&#xff0c;因此保存在了这篇博客中。 建议&#xff1a; 1. 类的声…

对高并发流量控制的一点思考

前言 在实际项目中&#xff0c;曾经遭遇过线上5WQPS的峰值&#xff0c;也在压测状态下经历过10WQPS的大流量请求&#xff0c;本篇博客的话题主要就是自己对高并发流量控制的一点思考。 应对大流量的一些思路 首先&#xff0c;我们来说一下什么是大流量&#xff1f; 大流量&…

ndk学习19: 使用Eclipse调试so

1. 设置调试选项在AndroidManifest文件加入允许调试android:debuggable"true" 此时编译项目会多出:2. 配置调试代码把需要调试的代码,放如按钮事件中,如果放在OnCreate会导致连接调试器时,代码已经跑完了Button btnTest (Button)findViewById(R.id.button1);btnT…

Inside the C++ Object Model | Outline

《Inside the C Object Model&#xff08;C对象模型&#xff09;》&#xff0c;这是一本灰常不错的书&#xff01; CSDN下载页面&#xff08;中文&#xff0c;侯捷译&#xff09; 豆瓣评论 读书笔记目录如下&#xff08;不定时更新&#xff09;&#xff1a; 转载于:https://www…

最优化课程笔记07——约束问题的非线性规划方法(重点:拉格朗日乘子法和惩罚函数法)

7.1 间接法&#xff1a;约束转化为无约束问题&#xff08;含一个重点&#xff1a;拉格朗日乘子法&#xff09; 当维数多的时候不适用 7.1.2拉格朗日乘子法&#xff08;重点&#xff09; 7.1.2.1 等式约束问题 7.1.2.2 不等式约束问题 7.1.3 惩罚函数法&#xff08;内惩罚函数法…

工业相机:传感器尺寸与像元尺寸的关系

相同分辨率的工业相机&#xff0c;传感器面积越大&#xff0c;则其单位像素的面积也越大&#xff0c;成像质量也会越好。同样的500万像素的工业相机&#xff0c;2/3”的传感器成像质量就要优于1/2”的。一般来说&#xff0c;工业相机的靶面大小&#xff0c;如果要求不是太严格&…

macOS下安装ipython

macOS下sudo安装ipython&#xff0c;会提示限错误&#xff1a; [Errno 1] Operation not permitted: /tmp/pip-Elrhse-uninstall/System/Library... 解决方法&#xff1a; pip install ipython --user -U 参考&#xff1a; http://chaishiwei.com/blog/994.html 本文转自 h2app…

结构化查询语言包含哪些方面?

结构化查询语言SQL&#xff08;STRUCTURED QUERY LANGUAGE&#xff09;是最重要的关系数据库操作语言&#xff0c;并且它的影响已经超出数据库领域&#xff0c;得到其他领域的重视和采用&#xff0c;如人工智能领域的数据检索&#xff0c;第四代软件开发工具中嵌入SQL的语言等。…

Opencv 找轮廓并画出相应的矩形

找轮廓参考以下大神的&#xff0c;对于里面的方法和结果存储解释的很清楚&#xff1b; http://blog.csdn.net/gubenpeiyuan/article/details/44922413 缺少的是画相应包围矩形的&#xff0c;其中找矩形用最小外接矩形函数cvMinAreaRect2 。 CvBox2D rect; CvPoint2D32f Corner…