PreparedStatement与Statement之间的区别

1 篇文章 0 订阅
1 篇文章 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值