我们知道,分享池(shared pool)是系统大局区(System Global Area ,SGA)中一个极其重要的分享内存构造。然而Oracle数据库将已解析、已编译的SQL 连同其他内容存储在这里。可是已解析,已编译的SQL要想告终其复用有一个前提,要求开发人员在大多数情形下都会利用绑定变量。本文我们主要就介绍了一些Oracle数据库绑定变量的知识,下面我们就开始介绍。
绑定变量(bind variable)是查询中的一个占位符。
例如比拟如下SQL语句:
- select * from table where id = 1与
- my_id := 1
- select * from table where id = my_id
对于***个SQL语句,在查询中利用直接量(常量),那么每个查询都将是一个崭新的查询,在数据库看来过去从未见过,定然对查询举行解析、限量(命名解析)、平安性察看、优化等。容易地讲,即便你厉行的每条不同的语句都要在厉行时举行编译。(解析包括有硬编码变量的语句称为硬解析)
而对于第二个查询利用了一个绑定变量my_id,变量值在查询厉行时供给。这个查询只编译顺次,随后会把查询计划存储在一个分享池(库缓存)中,以便尔后获得和重用这个查询计划,(重用已解析的查询计划称为软解析)。
软解析与硬解析之间的差异重要体目前以下几个方面:
1、与软解析相比硬解析必需的工夫更长,而且要花费更多的资源,硬解析会收缩系统能扶持的用户数。
2、硬解析一个查询时,数据库会更伙计夫地挪借一种低级串行穿戴备,这称为闩(latch),这些闩能防御Oracle分享内存中的数据构造不会同时被两个历程修正,而且万一有人正在修正数据构造,则不批准另外的人再来读取。对这些数据构造加闩的工夫越长、越频繁,排队期待闩的历程就越多,期待队列也越长。你可能开始垄断贵重的资源。有时你的计算机显明利用不足,然而数据库中的所有利用都运行得极其慢。构成这种假象的起因可能是有人割据着某种串行穿戴备,而其他期待串行穿戴备的人开始排队,因而你无法全速运行。数据库中凡是有一个利用出现不佳,就会严重地波及所有其他利用的功能。万一只有一个薄利用没利于用绑定变量,那么即便其他利用原本设计得很好,能妥本地将已解析的SQL放在分享池中以备重用,但因为这个薄利用的存在,过一段工夫就会从分享池中剔除已存储的SQL。这就使得这些设计贴切的利用也定然再次硬解析SQL。
代码告终实例:
1、oracle自己默认告终的绑定变量:
- for i in 1..1000 loop
- select count(*) into my_count from table where my_type = i;
- ne.nexuscenter.com.cn<end loop;
在上面的情形,Oracle会自己绑定变量,即,万一参数保留在一个数组中,select语句放在一个循环中,select 语句只会编译顺次。
2、动态绑定变量
- my_type:='type1';
- my_count := 0;
- my_sql:='select count(*) into :x from table where type = :y'
- Execute Immediate my_sql into my_count using my_type;
然而这段代码包括额外的String,并非全面必需。
关于Oracle数据库优化的知识就介绍到这里了,如果您想了解更多的关于Oracle数据库的知识,可以看一下这里的文章:http://database.51cto.com/oracle/,相信一定能够带给您收获的!
【编辑推荐】