以下例子是在delphi中编程实现,数据库为oracle,具体的代码省略了,只说明情况。
1、不使用绑定变量
例子:删除同一张表的两条记录。
sql语句如下:
(1)delete from t_englishscore_score where STUDENTNUM=’200431500123′
and LESSONNAME=’test’ and YEAR=’2005′ and TERM=’上’;
(2)delete from t_englishscore_score where STUDENTNUM=’200431500123′
and LESSONNAME=’毕业设计’ and YEAR=’2007′ and TERM=’下’
此时查询v$sqltext视图(它能够反映oracle 中share pool中的sql解析共享情况):
|
ADDRESS |
HASH_VALUE |
SQL_ID |
COMMAND_TYPE |
PIECE |
SQL_TEXT |
|
0000000173D47990 |
2193311325 |
1mhba361bqjkx |
7 |
0 |
delete from t_englishscore_score where STUDENTNUM=’200431500123′ |
|
0000000173D47990 |
2193311325 |
1mhba361bqjkx |
7 |
1 |
and LESSONNAME=’test’ and YEAR=’2005′ and TERM=’上’ |
|
0000000188BDAC00 |
321412224 |
3jjk8tn9khr40 |
7 |
0 |
delete from t_englishscore_score where STUDENTNUM=’200431500123′ |
|
0000000188BDAC00 |
321412224 |
3jjk8tn9khr40 |
7 |
1 |
and LESSONNAME=’毕业设计’ and YEAR=’2007′ and TERM=’下’ |
可见,没有使用绑定变量,两次删除的语句都分别对应不同的Hash_Value,在共享池中占据两个条目,而且关键是这两个条目能够被以后删除记录操作共享的几率大致趋于0,除非有同样的记录需要删除,这样就大大降低了共享池“共享”的功能。
2、使用绑定变量
例子:更新同一张表多条记录。
sql语句:在delphi中sql语句代码如下:
(1)update t_englishscore_score set LESSONNUM=:newLessonnum,LESSONNAME=:newLessonname,
YEAR=:newYear,TERM=:newTerm,COURSESORT=:newCourseSort,
CREDIT=:newCredit,SCORE=:newScore,ISDELETE=:newIsDelete
where STUDENTNUM=:oldStudentnum and LESSONNAME=:oldLessonname
and YEAR=:oldYear and TERM=:oldTerm
每次更新,只要赋予相应的参数即可。多次更新后,查看v$sqltext:
|
ADDRESS |
HASH_VALUE |
SQL_ID |
COMMAND_TYPE |
PIECE |
SQL_TEXT |
|
00000001735AF2B0 |
1453164333 |
gfdbw8db9v1td |
6 |
0 |
update t_englishscore_score set LESSONNUM=:1,LESSONNAME=:2,YEAR= |
|
00000001735AF2B0 |
1453164333 |
gfdbw8db9v1td |
6 |
1 |
:3,TERM=:4,COURSESORT=:5,CREDIT=:6,SCORE=:7,ISDELETE=:8 where S |
|
00000001735AF2B0 |
1453164333 |
gfdbw8db9v1td |
6 |
2 |
TUDENTNUM=:9 and LESSONNAME=:10 and YEAR=:11 and TERM=:12 |
可见使用绑定变量后,多次更新操作,都很好的共享了一条sql解析,大大降低了硬解析的数量,相应的提供了软解析的数量,从而真正发挥了共享池“共享”的作用。

最近留言