SQL预编译

数据库执行SQL的步骤

通常,数据库接收一条 SQL,到返回结果,分为三个过程:

  1. 词法和语义解析
  2. 优化sql语句,制定执行计划
  3. 执行并返回结果

复杂 的 SQL,第1、2步的时间就 越长

为什么有预编译

很多情况下,一条SQL语句会 反复执行,或者每次执行的时候 只有个别的值不同

比如:selectwhere 条件的值不同,updateset的值不同,insertvalues 值不同,都会造成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 时,就 不需要预编译,直接将参数传入,就会执行。

注意:不是所有预编译语句都一定会被缓存,数据库本身会用一种策略(内部机制)

好处

  1. 提高 SQL 执行效率。第一次需要预编译,之后不需要编译,直接执行

  2. 防止SQL注入

预编译与JDBC

在 JDBC 中,通过 PreparedStatement 启用预编译


原文出处:http://malaoshi.top/show_1IX2b20M4IpL.html