关闭

PreparedStatement与Statement之间的区别

62人阅读 评论(0) 收藏 举报
分类:

PreparedStatement与Statement之间的区别主要如下:


1、进行多次同样类型的数据库操作时,PreparedStatement效率更高。

这是因为SQL语句在数据库中将被编译为可执行的SQL语句,PreparedStatement通常可以在缓存中找到编译过的SQL语句而Statement不能,缓存的速度更快,因此PreparedStatement比Statement省了编译时间。

同样类型的数据库操作指的是多次执行的SQL语句出了参数不同之外其他都相同,如“select * from student where sid = 1”和“select * from student where sid = 2”。


(1)编译时间是否很长呢?编译过程中都做什么呢?


编译过程也叫解析,包含以下内容:

Ø 语法检查;
Ø 语义检查,看参考对象是否存在,类型是否正确;
Ø (如果是CBO优化模式)收集参考对象的统计;
Ø 检查用户的权限是否足够;
Ø 从许多可能的执行路径中选择或新生成一条作为执行计划;
Ø 生成语句的编译版本(P-CODE)。

这是一个很占据资源的过程,省略之后效果明显。


(2)那么为什么PreparedStatement可以在缓存中找到编译好的SQL语句而Statement不能呢?

之前调用过的SQL语句其编译后的结果会被存在缓存中,如果又来了完全相同的SQL语句的话,缓存中的编译结果就可以直接拿来使用。
注意缓存命中需要“完全相同”,通常是计算哈希值来判断当前SQL与缓存中的SQL是否完全相同。PreparedStatement不带查询参数、属于模板,如“select * from student where sid = ?”,所以,不同参数的PreparedStatement都是完全相同的(模板完全相同)。这样可以在缓存中得到模板的编译结果,因为没有具体参数,叫做预编译;具体参数来了之后与模板的编译结果结合就可以直接执行了。而Statement不同,它带数值,如两个语句“select * from student where sid = 1”和“select * from student where sid = 2”就不能叫完全相同。连参数都完全一样的情况才叫完全相同,但这种连续多次执行同一条SQL语句的情况在实际中基本不会发生。
所以,PreparedStatement在多次执行同样类型的数据库操作时的效率更高。

(3)执行计划。

前面的编译过程中提到了编译过程中要选择或生成执行计划。那么执行计划是什么含义呢?

对于每一条SQL语句,有不同的具体执行方式。数据库会选择, 是读整个客户表好呢, 还是利用索引会比较快些. 数据库比较所有可能方法所耗费的资源. 最终SQL语句被物理性执行的方法被称做执行计划或者是查询计划.
一个执行计划右若干基本操作组成. 例如, 遍历整张表, 利用索引, 执行一个嵌套循环或Hash连接等等.  所有的基本操作都有一个输出: 结果集. 有些, 象嵌套循环, 有一个输入. 其他的, 象Hash连接, 有两个输入. 每个输入应与其它基本操作的的输出想连接. 数据库服务器在执行sql语句之前会制定几套执行计划!看那个机会消耗的系统资源少,就是用那套计划!数据库服务器在执行sql语句之前会制定几套执行计划!看那个机会消耗的系统资源少,就是用那套计划!

未完待续。。。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:62次
    • 积分:11
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档