数据库执行SQL的步骤
通常,数据库接收一条 SQL,到返回结果,分为三个过程:
- 词法和语义解析
- 优化sql语句,制定执行计划
- 执行并返回结果
越 复杂 的 SQL,第1、2步的时间就 越长
为什么有预编译
很多情况下,一条SQL语句会 反复执行,或者每次执行的时候 只有个别的值不同
比如:select
的where
条件的值不同,update
的 set
的值不同,insert
的 values
值不同,都会造成SQL语句的不同
如下:
select * from emp where sal>3000
select * from emp where sal>4000
select * from emp where sal>5000
这些 SQL 语句,只是 查询条件的值不同,其他完全相同
缺点
当这些值不同时,就认为是不同的SQL语句,就进行 词法语义解析、优化、制定执行计划,就会 影响效率,如下:
执行 select * from emp where sal>3000
语句,需要执行步骤1、2、3
执行 select * from emp where sal>4000
语句,需要执行步骤1、2、3
执行 select * from emp where sal>5000
语句,需要执行步骤1、2、3
而且越 复杂 的 SQL,第1、2步的时间就 越长,很有可能 步骤 1、2 加起来的时间 比 步骤 3的时间还要长
解决
数据库支持预编译
预编译
将这类 SQL中的 值
用 占位符
替代,相当于将sql语句模板化,如下:
select * from emp where sal>?
缓存预编译
第一次执行时,需要预编译,之后会被数据库缓存,当再次执行该 SQL 时,就 不需要预编译,直接将参数传入,就会执行。
注意:不是所有预编译语句都一定会被缓存,数据库本身会用一种策略(内部机制)
好处
提高 SQL 执行效率。第一次需要预编译,之后不需要编译,直接执行
防止SQL注入
预编译与JDBC
在 JDBC 中,通过 PreparedStatement
启用预编译