- 浏览: 138286 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (52)
- oracle linux R6-U2-server-i386 (8)
- oracleDBA (25)
- 虚拟机-vmware-8.0.2 (2)
- linux-ubuntu (0)
- oracle背景资料 (28)
- DOS (3)
- sql常用操作 (2)
- win7/XP/03/08/2K/ (1)
- NT系统优化 (2)
- 网络 (1)
- 安全 (0)
- 乌七杂八资料库 (23)
- 个人心情 (2)
- ESXI 4.1 (1)
- vsphere5.0 (4)
- rac (3)
- oracle linux R6-U2-server-i386,oracle9204 (2)
- 条件处理符号 (1)
- 批处理 (2)
最新评论
-
yexiaochong:
我从头到尾看完了。写得也挺有道理的。我也类似你一样。花了不止两 ...
工作意向及规划个人建议 -
netkiller.github.com:
写的真多,实在看不下去了,支持一下
工作意向及规划个人建议
原文转载自linuxg公社 http://www.linuxidc.com/Linux/2011-04/34781.htm
Oracle 绑定变量
http://www.linuxidc.com/%22Linux/2011-04/34781.htm
一.绑定变量
bind variable: A variable in a SQL statement that must be replaced with a valid value, or the address of a value, in order for the statement to successfully execute.
变量绑定是OLTP系统中一个非常值得关注的技术。良好的变量绑定会使OLTP系统数据库中的SQL 执行速度飞快,内存效率极高;不使用绑定变量可能会使OLTP 数据库不堪重负,资源被SQL解析严重耗尽,系统运行缓慢。
当一个用户与数据库建立连接后,会向数据库发出操作请求,即向数据库送过去SQL语句。 Oracle 在接收到这些SQL后,会先对这个SQL做一个hash 函数运算,得到一个Hash值,然后到共享池中寻找是否有和这个hash 值匹配的SQL存在。 如果找到了,Oracle将直接使用已经存在的SQL 的执行计划去执行当前的SQL,然后将结果返回给用户。 如果在共享池中没有找到相同Hash 值的SQL,oracle 会认为这是一条新的SQL。 会进行解析。
Oracle 解析的步骤如下:
(1) 语法解析
(2) 语义解析
(3) 生成执行计划,这里分软解析和硬解析。硬解析是非常耗资源的。
(4) SQL的执行
关于SQL的解析,详见Blog:
Oracle SQL的硬解析和软解析
http://www.linuxidc.com/Linux/2011-04/34783.htm
了解了SQL 的执行过程,在来看一些绑定变量,绑定变量的本质就是本来需要做Oracle 硬解析的SQL 变成软解析,以减少ORACLE 花费在SQL解析上的时间和资源。
加入有两条SQL:
Select salary from user where name=’A’;
Select salary from user where name=’B’;
如果没有用绑定变量,那么这2条SQL 会被解析2次,因为他们的谓词部分不一样。 如果我们用了绑定变量,如:
Select salary from user where name=:X;
这时,之前的2条SQL就变成了一种SQL, Oracle 只需要对每一种SQL做一次硬解析,之后类似的SQL 都使用这条SQL产生的执行计划,这样就可以大大降低数据库花费在SQL解析上的资源开销。 这种效果当SQL执行的越多,就越明显。
简单的说,绑定变量就是拿一个变量来代替谓词常量,让Oracle每次对用户发来的SQL做hash 运算时,运算出的结果都是同样的Hash值,于是将所有的用户发来的SQL看作是同一个SQL来对象。
二. OLAP 和OLTP 系统中的绑定变量
OLAP 和 OLTP 系统是有很大差异的。 他们之间的区别,详细参考Blog:
Oracle OLAP 与 OLTP 介绍
http://www.linuxidc.com/Linux/2011-04/34784.htm
在OLTP系统中,我们可以使用绑定变量是因为在OLTP中,SQL语句大多是比较简单或者操作的结果集都很小。当一个表上创建了索引,那么这种极小结果集的操作使用索引最合适,并且几乎所有的SQL的执行计划的索引都会被选择,因为这种情况下,索引可能只需要扫描几个数据块就可以定位到数据,而全表扫描将会相当耗资源。 因此,这种情况下,即使每个用户的谓词条件不一样,执行计划也是一样的,就是都用索引来访问数据,基本不会出现全表扫描的情况。 在这种执行计划几乎唯一的情况下,使用绑定变量来代替谓词常量,是合适的。
在OLAP系统中,SQL的操作就复杂很多,OLAP数据库上大多数时候运行的一些报表SQL,这些SQL经常会用到聚合查询(如:group by),而且结果集也是非常庞大,在这种情况下,索引并不是必然的选择,甚至有时候全表扫描的性能会更优于索引,即使相同的SQL,如果谓词不同,执行计划都可能不同。
对于OLAP系统中的绑定变量,有以下原则:
(1) OLAP 系统完全没有必要绑定变量,那样只会带来负面的影响,比如导致SQL选择错误的执行,这个代价有时是灾难性的;让Oracle对每条SQL做硬分析,确切的知道谓词条件的值,这对执行计划的选择至关重要,这样做的原因是,在OLAP系统中,SQL硬分析的代价是可以忽略的,系统的资源基本上是用于做大的SQL查询,和查询比起来,SQL解析消耗的资源显得微不足道。所以得到一个最优的执行计划就非常重要。
(2) 在OLAP系统中,让Oracle确切地知道谓词的数值至关重要,它直接决定了SQL执行计划的选择,这样做的方式就是不要绑定变量。
(3) 在OLAP系统中,表,索引的分析显得直观重要,因为它是Oracle 为SQL做出正确的执行计划的信息的来源和依据,所以需要建立一套能够满足系统需求的对象分析的执行Job。
先看一段官网的说明:
The query optimizer peeks at the values of user-defined bind variables on the first invocation of a cursor. This feature enables the optimizer to determine the selectivity of any WHERE clause condition as if literals have been used instead of bind variables.
To ensure the optimal choice of cursor for a given bind value, Oracle Database uses bind-aware cursor matching. The system monitors the data access performed by the query over time, depending on the bind values. If bind peeking takes place, and if the database uses a histogram to compute selectivity of the predicate containing the bind variable, then the database marks the cursor as bind-sensitive.
Whenever the database determines that a cursor produces significantly different data access patterns depending on the bind values, the database marks this cursor as bind-aware. Oracle Database switches to bind-aware cursor matching to select the cursor for this statement. When bind-aware cursor matching is enabled, the database selects plans based on the bind value and the optimizer estimate of its selectivity. With bind-aware cursor matching, a SQL statement with user-defined bind variable can have multiple execution plans, depending on the bind values.
When bind variables appear in a SQL statement, the database assumes that cursor sharing is intended and that different invocations use the same execution plan. If different invocations of the cursor significantly benefit from different execution plans, then bind-aware cursor matching is required. Bind peeking does not work for all clients, but a specific set of clients.
From:http://download.Oracle.com/docs/cd/E11882_01/server.112/e10821/optimops.htm#PFGRF94588
Bind Peeking是Oracle 9i中引入的新特性,它的作用就是在SQL语句硬分析的时候,查看一下当前SQL谓词的值,以便生成最佳的执行计划。 而在oracle 9i之前的版本中,Oracle 只根据统计信息来做出执行计划。
要注意的是,Bind Peeking只发生在硬分析的时候,即SQL被第一次执行的时候,之后的变量将不会在做peeking。我们可以看出,Bind peeking并不能最终解决不同谓词导致选择不同执行计划的问题,它只能让SQL第一次执行的时候,执行计划选择更加准确,并不能帮助OLAP系统解决绑定变量导致执行计划选择错误的问题。这也是OLAP不应该使用绑定变量的一个原因。
总结:
对于OLTP系统,相同的SQL重复频率非常高,如果优化器反复解析SQL,必然会极大的消耗系统资源,另外,OLTP系统用户请求的结果集都非常小,所以基本上都考虑使用索引。 Bind Peeking 在第一次获得了一个正确的执行计划之后,后续的所有SQL都按照这个执行计划来执行,这样就极大的改善了系统的性能。
对于OLAP系统,SQL执行计划和谓词关系极大,谓词值不同,可能执行计划就不同,如果采用相同的执行计划,SQL的执行效率必然很低。另外,一个OLAP系统数据库每天执行的SQL数量远远比OLTP少,并且SQL重复频率也远远低于OLTP系统,在这种条件下,SQL解析花费的代价和SQL执行花费的代价相比,解析的代价可以完全忽略。
所以,对于OLAP系统,不需要绑定变量,如果使用可能导致执行计划选择错误。 并且,如果用了绑定变量,Bind Peeking也只能保证第一条硬分析SQL能正确的选择执行计划,如果后面的谓词改变,很可能还是会选择错误的执行计划。 因此在OLAP系统中,不建议使用绑定变量。
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-04/34781p2.htm
Oracle 绑定变量
http://www.linuxidc.com/%22Linux/2011-04/34781.htm
一.绑定变量
bind variable: A variable in a SQL statement that must be replaced with a valid value, or the address of a value, in order for the statement to successfully execute.
变量绑定是OLTP系统中一个非常值得关注的技术。良好的变量绑定会使OLTP系统数据库中的SQL 执行速度飞快,内存效率极高;不使用绑定变量可能会使OLTP 数据库不堪重负,资源被SQL解析严重耗尽,系统运行缓慢。
当一个用户与数据库建立连接后,会向数据库发出操作请求,即向数据库送过去SQL语句。 Oracle 在接收到这些SQL后,会先对这个SQL做一个hash 函数运算,得到一个Hash值,然后到共享池中寻找是否有和这个hash 值匹配的SQL存在。 如果找到了,Oracle将直接使用已经存在的SQL 的执行计划去执行当前的SQL,然后将结果返回给用户。 如果在共享池中没有找到相同Hash 值的SQL,oracle 会认为这是一条新的SQL。 会进行解析。
Oracle 解析的步骤如下:
(1) 语法解析
(2) 语义解析
(3) 生成执行计划,这里分软解析和硬解析。硬解析是非常耗资源的。
(4) SQL的执行
关于SQL的解析,详见Blog:
Oracle SQL的硬解析和软解析
http://www.linuxidc.com/Linux/2011-04/34783.htm
了解了SQL 的执行过程,在来看一些绑定变量,绑定变量的本质就是本来需要做Oracle 硬解析的SQL 变成软解析,以减少ORACLE 花费在SQL解析上的时间和资源。
加入有两条SQL:
Select salary from user where name=’A’;
Select salary from user where name=’B’;
如果没有用绑定变量,那么这2条SQL 会被解析2次,因为他们的谓词部分不一样。 如果我们用了绑定变量,如:
Select salary from user where name=:X;
这时,之前的2条SQL就变成了一种SQL, Oracle 只需要对每一种SQL做一次硬解析,之后类似的SQL 都使用这条SQL产生的执行计划,这样就可以大大降低数据库花费在SQL解析上的资源开销。 这种效果当SQL执行的越多,就越明显。
简单的说,绑定变量就是拿一个变量来代替谓词常量,让Oracle每次对用户发来的SQL做hash 运算时,运算出的结果都是同样的Hash值,于是将所有的用户发来的SQL看作是同一个SQL来对象。
二. OLAP 和OLTP 系统中的绑定变量
OLAP 和 OLTP 系统是有很大差异的。 他们之间的区别,详细参考Blog:
Oracle OLAP 与 OLTP 介绍
http://www.linuxidc.com/Linux/2011-04/34784.htm
在OLTP系统中,我们可以使用绑定变量是因为在OLTP中,SQL语句大多是比较简单或者操作的结果集都很小。当一个表上创建了索引,那么这种极小结果集的操作使用索引最合适,并且几乎所有的SQL的执行计划的索引都会被选择,因为这种情况下,索引可能只需要扫描几个数据块就可以定位到数据,而全表扫描将会相当耗资源。 因此,这种情况下,即使每个用户的谓词条件不一样,执行计划也是一样的,就是都用索引来访问数据,基本不会出现全表扫描的情况。 在这种执行计划几乎唯一的情况下,使用绑定变量来代替谓词常量,是合适的。
在OLAP系统中,SQL的操作就复杂很多,OLAP数据库上大多数时候运行的一些报表SQL,这些SQL经常会用到聚合查询(如:group by),而且结果集也是非常庞大,在这种情况下,索引并不是必然的选择,甚至有时候全表扫描的性能会更优于索引,即使相同的SQL,如果谓词不同,执行计划都可能不同。
对于OLAP系统中的绑定变量,有以下原则:
(1) OLAP 系统完全没有必要绑定变量,那样只会带来负面的影响,比如导致SQL选择错误的执行,这个代价有时是灾难性的;让Oracle对每条SQL做硬分析,确切的知道谓词条件的值,这对执行计划的选择至关重要,这样做的原因是,在OLAP系统中,SQL硬分析的代价是可以忽略的,系统的资源基本上是用于做大的SQL查询,和查询比起来,SQL解析消耗的资源显得微不足道。所以得到一个最优的执行计划就非常重要。
(2) 在OLAP系统中,让Oracle确切地知道谓词的数值至关重要,它直接决定了SQL执行计划的选择,这样做的方式就是不要绑定变量。
(3) 在OLAP系统中,表,索引的分析显得直观重要,因为它是Oracle 为SQL做出正确的执行计划的信息的来源和依据,所以需要建立一套能够满足系统需求的对象分析的执行Job。
先看一段官网的说明:
The query optimizer peeks at the values of user-defined bind variables on the first invocation of a cursor. This feature enables the optimizer to determine the selectivity of any WHERE clause condition as if literals have been used instead of bind variables.
To ensure the optimal choice of cursor for a given bind value, Oracle Database uses bind-aware cursor matching. The system monitors the data access performed by the query over time, depending on the bind values. If bind peeking takes place, and if the database uses a histogram to compute selectivity of the predicate containing the bind variable, then the database marks the cursor as bind-sensitive.
Whenever the database determines that a cursor produces significantly different data access patterns depending on the bind values, the database marks this cursor as bind-aware. Oracle Database switches to bind-aware cursor matching to select the cursor for this statement. When bind-aware cursor matching is enabled, the database selects plans based on the bind value and the optimizer estimate of its selectivity. With bind-aware cursor matching, a SQL statement with user-defined bind variable can have multiple execution plans, depending on the bind values.
When bind variables appear in a SQL statement, the database assumes that cursor sharing is intended and that different invocations use the same execution plan. If different invocations of the cursor significantly benefit from different execution plans, then bind-aware cursor matching is required. Bind peeking does not work for all clients, but a specific set of clients.
From:http://download.Oracle.com/docs/cd/E11882_01/server.112/e10821/optimops.htm#PFGRF94588
Bind Peeking是Oracle 9i中引入的新特性,它的作用就是在SQL语句硬分析的时候,查看一下当前SQL谓词的值,以便生成最佳的执行计划。 而在oracle 9i之前的版本中,Oracle 只根据统计信息来做出执行计划。
要注意的是,Bind Peeking只发生在硬分析的时候,即SQL被第一次执行的时候,之后的变量将不会在做peeking。我们可以看出,Bind peeking并不能最终解决不同谓词导致选择不同执行计划的问题,它只能让SQL第一次执行的时候,执行计划选择更加准确,并不能帮助OLAP系统解决绑定变量导致执行计划选择错误的问题。这也是OLAP不应该使用绑定变量的一个原因。
总结:
对于OLTP系统,相同的SQL重复频率非常高,如果优化器反复解析SQL,必然会极大的消耗系统资源,另外,OLTP系统用户请求的结果集都非常小,所以基本上都考虑使用索引。 Bind Peeking 在第一次获得了一个正确的执行计划之后,后续的所有SQL都按照这个执行计划来执行,这样就极大的改善了系统的性能。
对于OLAP系统,SQL执行计划和谓词关系极大,谓词值不同,可能执行计划就不同,如果采用相同的执行计划,SQL的执行效率必然很低。另外,一个OLAP系统数据库每天执行的SQL数量远远比OLTP少,并且SQL重复频率也远远低于OLTP系统,在这种条件下,SQL解析花费的代价和SQL执行花费的代价相比,解析的代价可以完全忽略。
所以,对于OLAP系统,不需要绑定变量,如果使用可能导致执行计划选择错误。 并且,如果用了绑定变量,Bind Peeking也只能保证第一条硬分析SQL能正确的选择执行计划,如果后面的谓词改变,很可能还是会选择错误的执行计划。 因此在OLAP系统中,不建议使用绑定变量。
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-04/34781p2.htm
发表评论
-
oracle 10g 使用expdp network_link导出远程数据库到本地文件 【转载】
2012-12-11 13:45 5423文章不错,解除疑惑,oracle10G0204可以实现远程导入 ... -
批处理全盘搜索文件的几种方法【转载】
2012-12-04 20:06 1747原作者地址:http://blog.dzwww.com/?ui ... -
oracle中ddl不能回滚的问题【转载】
2012-11-27 10:25 1098原文地址: http://www.2cto.com/datab ... -
No startup acknowledgement from forked process after 30 seconds
2012-11-22 11:20 1707摘抄2篇文章。都是这个问题的描述,结果都是没有办法解决,直接重 ... -
oracle在linux下安装遇到的所有的问题总结说明(3)
2012-10-30 15:48 1313大部分内容为已经遇到过的问题解决方案,基本都是谷歌出来的,留下 ... -
oracle on linux非官方做法遇到的问题集锦(1)
2012-10-30 15:44 17481、安装oracle linux 6.2创 ... -
oracle在linux下安装遇到的所有的问题总结说明(2)(20121122修改)
2012-10-30 15:35 2099安装的时候遇到的问题说明(部分内容 ... -
oracle在linux下安装遇到的所有的问题总结说明(1)
2012-10-30 15:31 1339安装oracle 官方文档,翻译说明( ... -
.【转载】oracle物化视图的一般用法
2012-08-29 10:45 911本文转载自乔文《oracle ... -
ora-12542 address in used(转载)
2012-06-16 16:51 1609转载的,原作者网址:http://space.itpub.ne ... -
EXP-00091 Exporting questionable statistics
2012-06-15 20:02 1202http://space.itpub.net/trackbac ... -
unable to load module /usr/lib/vmware/vmkmod/vmfs3:failure解决方案译文
2012-05-28 23:33 4386此处为翻译一篇(解决E ... -
oracle9I坏块错误
2012-05-10 18:41 862在一个客户的9201 for Windows数据库中发现了 ... -
《转载》ora-00020超出最大进程数
2012-05-10 18:42 1001纯属学习查询资料,没什么说的,当资料了,感谢作者,转载无罪 ... -
《转载》oracle1000问
2012-05-10 18:42 784没什么说的,比较适合初学者的,呵呵,一块学习吧。 -
《转载》韩顺平-玩转oracle视频教材笔记(文档)
2012-05-10 18:42 1009转载的,那下载的,忘了,全名叫oracle10G从入门到精 ... -
ora-27100shared memory realm already exists(20120529修改)
2012-05-10 18:42 2291这个问题一般情况下,是因为调整内存参数的时候出现问题了,而且数 ... -
FATAL ERROR IN TWO-TASK SERVER: error = 12571
2012-05-11 10:18 1208这个问题貌似是因为应用程序和数据库在连接的时候出现各种意外 ... -
ora-12516监听程序找不到符合协议堆栈要求的可用处理程
2012-05-11 10:19 10043oracle服务器上某个数据库出现' ORA-12516: T ... -
ora-02095无法修改指定的初始化参数
2012-05-11 10:19 19155说个题外话,话说我在查找一些oracle报错的时候,最容易 ...
相关推荐
oracle 执行计划详解 Oracle 执行计划是数据库性能调整的关键部分,对于想要学习 Oracle 数据库的朋友非常有帮助。下面是Oracle 执行计划的背景知识和重要概念。 共享 SQL 语句 Oracle 将 SQL 语句及解析后得到的...
"Oracle 执行计划详解" Oracle 执行计划是数据库性能优化的关键。为了更好地理解和优化 Oracle 数据库的执行计划,我们需要了解执行计划的生成过程、优化方法和执行计划的解读方法。 执行计划生成过程 执行计划的...
### Oracle BIEE 变量总结与应用 #### 一、引言 Oracle Business Intelligence Enterprise Edition (BIEE) 是一款强大的商业智能工具,能够帮助组织机构从数据中提取价值并做出更好的决策。在 BIEE 的开发过程中,...
本文档详细解释了 ORACLE 的执行计划背景知识,包括共享 SQL 语句、执行计划的存储和共享、绑定变量的使用、执行计划的生成和共享、执行计划的优化等方面的内容。 一、共享 SQL 语句 ORACLE 对相同的 SQL 语句进行...
- SQL书写规则,比如绑定变量的使用,以及避免在where条件中使用变量判断等。 2. CBO优化案例分析 - 分析了不同的案例背景和系统配置,以及测试方法。 - 提供了SQL调优的思路和方法,包括面对数据分布不均匀、...
- 使用相同的绑定变量名称:即使绑定变量的实际值不同,也必须使用相同的变量名。 - **实例说明**: - 如果两个用户分别使用私有同义词`sal_limit`来访问不同的对象,那么他们的SQL语句不会被共享。 - 如果两个...
- **绑定变量的影响**:如果两个SQL语句中使用了不同的绑定变量名称,即使在运行时这些变量的实际值相同,Oracle也不会认为这两个语句是相同的,因此不会共享执行计划。 #### 总结 通过合理选择优化器模式、利用...
### Oracle语句优化详解 #### 一、Oracle优化器模式的理解与选择 Oracle数据库通过不同的优化器模式来决定执行计划的选择。这些模式包括基于规则的优化(RULE)、基于成本的优化(CBO)以及自动选择(CHOOSE)。 ...
### Oracle语句优化规则详解 #### 一、选用适合的Oracle优化器 Oracle数据库提供了三种主要的优化器:基于规则的优化器(RULE)、基于成本的优化器(COST)和选择性优化器(CHOOSE)。优化器的选择直接影响到SQL...
例如,插入数据时,可以使用变量绑定的方式执行INSERT语句: ```python sql = "INSERT INTO table_name (column1, column2) VALUES (:1, :2)" params = ('value1', 'value2') cursor.execute(sql, params) ``` 这段...
对于绑定变量,必须使用相同名称的绑定变量才能确保SQL语句的共享,即使在运行时,这些变量被赋予了相同的值。 文档中也提到了绑定变量的重要性。绑定变量是在SQL语句中使用占位符代替直接在查询中指定的值,这样...
当多个查询具有相同的结构但不同参数时,使用绑定变量可以使Oracle重用解析计划。例如,动态SQL和存储过程中的参数化查询应尽可能使用绑定变量。 5. **缓存与高速缓冲**: Oracle使用缓存来加速数据访问。共享池中...
例如,合理使用索引、避免全表扫描、使用绑定变量等。其次是SQL语句的结构调整,例如通过重写SQL语句来减少中间结果集的生成,降低资源消耗。 再者,要熟悉Oracle的执行计划分析。执行计划是SQL语句性能的蓝图,...
3. **绑定变量一致**:SQL语句中使用的绑定变量名称也必须完全相同才能共享。 通过以上方法,不仅可以提高Oracle数据库的查询性能,还能有效利用系统资源,降低维护成本。对于大型数据库应用而言,合理设置优化器...
【VC++开发Oracle数据库应用程序详解】 在开发Oracle数据库应用程序时,Visual C++(简称VC)是一种常见的客户端开发工具,尤其适合构建与Oracle数据库交互的应用。本文主要探讨两种使用VC++开发Oracle应用程序的...
优化处理器管理是提升数据库性能的关键,包括合理设置并行度、使用绑定变量等策略。 3. **存储器管理**:Oracle数据库采用了一种称为SGA(系统全局区)的内存结构,其中包含了缓存数据、解析缓冲区、重做日志缓冲区...
4. **绑定变量**:使用绑定变量可以避免硬解析,提高SQL语句的重用率,从而减少解析开销和内存占用。 5. **并行查询**:Oracle支持并行查询,将大任务分解为多个子任务并发执行,以加速处理速度。但过度的并行可能...
Oracle 12c-优化 Hint详解.pdf Oracle 12c-优化 Oracle 索引技术.pdf Oracle 12c 执行计划.pdf ...Oracle 12c 使用绑定变量 VS 不使用绑定变量.pdf Oracle 12c 自动工作负载信息库AWR.pdf Oracle 12c 常用SQL.pdf