2024年5月6日发(作者:庚思萱)
之前对ORACLE中的变量一直没个太清楚的认识,比如说使用:、&、&&、DEIFINE、VARIABLE……等等。今天正好闲下来,上网搜
了搜相关的文章,汇总了一下,贴在这里,方便学习。
==================================================================================
在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬
解析,一种叫做软解析.
一个硬解析需要经解析,制定执行路径优化访问计,划等许多的步骤.硬解释不仅
仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系
统的规模的扩大(即限制了系统的并发行),而且引起的问题不能通过增加内
存条和cpu的数量来解决。之所以这样是因为门闩是为了顺序访问以及修改一些
内存区域而设置的,这些内存区域是不能被同时修改。当一个sql语句提交后,
oracle会首先检查一下共享缓冲池(shared pool)里有没有与之完全相同的语
句,如果有的话只须执行软分析即可,否则就得进行硬分析。
而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量
的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交
的sql语句都完全一样。
1.
sqlplus中如何使用绑定变量,可以通过variable来定义
[c-sharp] view plaincopyprint?
1. SQL> select * from tt where id=1;
2.
3. ID NAME
4. ---------- ----------------------------------------
5. 1 test
6.
7. SQL> select * from tt where id=2;
8.
9. ID NAME
10. ---------- ----------------------------------------
11. 2 test
12.
13. SQL> variable i number;
14. SQL> exec :i :=1;
15.
16. PL/SQL 过程已成功完成。
17.
18. SQL> select *from tt where id=:i;
19.
20. ID NAME
21. ---------- ----------------------------------------
22. 1 test
23.
24. SQL> exec :i :=2;
25.
26. PL/SQL 过程已成功完成。
27.
28. SQL> select *from tt where id=:i;
29.
30. ID NAME
31. ---------- ----------------------------------------
32. 2 test
33.
34. SQL> print i;
35.
36. I
37. ----------
38. 2
39.
40. SQL> select sql_text,parse_calls from v$sql where sql_text like 'select * fr
om t
41. t where id=%';
42.
43. SQL_TEXT PARSE_CALLS
44. ------------------------------------------------------------ -----------
45. select * from tt where id=2 1
46. select * from tt where id=1 1
47. select * from tt where id=:i 2
48. SQL>
SQL> select * from tt where id=1;
ID NAME
---------- ----------------------------------------
1 test
SQL> select * from tt where id=2;
ID NAME
---------- ----------------------------------------
2 test
SQL> variable i number;
SQL> exec :i :=1;
PL/SQL 过程已成功完成。
SQL> select *from tt where id=:i;
从上面试验发现绑定变量i的使用使查询id=1和id=2的sqlselect *from tt where
id=:i得以重复
使用,从而避免了hard parse,这里的PARSE_CALLS=2包括了一次soft parse
2.
2024年5月6日发(作者:庚思萱)
之前对ORACLE中的变量一直没个太清楚的认识,比如说使用:、&、&&、DEIFINE、VARIABLE……等等。今天正好闲下来,上网搜
了搜相关的文章,汇总了一下,贴在这里,方便学习。
==================================================================================
在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬
解析,一种叫做软解析.
一个硬解析需要经解析,制定执行路径优化访问计,划等许多的步骤.硬解释不仅
仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系
统的规模的扩大(即限制了系统的并发行),而且引起的问题不能通过增加内
存条和cpu的数量来解决。之所以这样是因为门闩是为了顺序访问以及修改一些
内存区域而设置的,这些内存区域是不能被同时修改。当一个sql语句提交后,
oracle会首先检查一下共享缓冲池(shared pool)里有没有与之完全相同的语
句,如果有的话只须执行软分析即可,否则就得进行硬分析。
而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量
的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交
的sql语句都完全一样。
1.
sqlplus中如何使用绑定变量,可以通过variable来定义
[c-sharp] view plaincopyprint?
1. SQL> select * from tt where id=1;
2.
3. ID NAME
4. ---------- ----------------------------------------
5. 1 test
6.
7. SQL> select * from tt where id=2;
8.
9. ID NAME
10. ---------- ----------------------------------------
11. 2 test
12.
13. SQL> variable i number;
14. SQL> exec :i :=1;
15.
16. PL/SQL 过程已成功完成。
17.
18. SQL> select *from tt where id=:i;
19.
20. ID NAME
21. ---------- ----------------------------------------
22. 1 test
23.
24. SQL> exec :i :=2;
25.
26. PL/SQL 过程已成功完成。
27.
28. SQL> select *from tt where id=:i;
29.
30. ID NAME
31. ---------- ----------------------------------------
32. 2 test
33.
34. SQL> print i;
35.
36. I
37. ----------
38. 2
39.
40. SQL> select sql_text,parse_calls from v$sql where sql_text like 'select * fr
om t
41. t where id=%';
42.
43. SQL_TEXT PARSE_CALLS
44. ------------------------------------------------------------ -----------
45. select * from tt where id=2 1
46. select * from tt where id=1 1
47. select * from tt where id=:i 2
48. SQL>
SQL> select * from tt where id=1;
ID NAME
---------- ----------------------------------------
1 test
SQL> select * from tt where id=2;
ID NAME
---------- ----------------------------------------
2 test
SQL> variable i number;
SQL> exec :i :=1;
PL/SQL 过程已成功完成。
SQL> select *from tt where id=:i;
从上面试验发现绑定变量i的使用使查询id=1和id=2的sqlselect *from tt where
id=:i得以重复
使用,从而避免了hard parse,这里的PARSE_CALLS=2包括了一次soft parse
2.