数据库应用中,SQL执行效率是决定系统整体性能的关键瓶颈之一。应用程序与数据库的交互通常涉及大量重复或结构相似的SQL查询。为了应对这一挑战,Prepared Statement(预编译语句)机制应运而生。本文简要介绍数据库中SQL执行流程,然后Oracle、DB2和MySQL传统数据库的Prepare处理机制以及参数控制。
1、数据库中SQL执行过程
数据库中SQL语句的执行通常会经历SQL语句解析、SQL语句优化并生成执行计划、SQL语句执行这三个阶段。以查询语句为例,SQL语句在数据库中依次进行以下环节:
- 查询解析:对输入的查询语句进行解析,把查询语句从文本方式翻译为执行引擎可以识别的语句。通常包括词法分析、语法分析和语义分析等阶段。
- 查询优化:对查询进行基于规则的逻辑优化RBO和基于代价的物理优化CBO,并生成对应的执行计划;
- 查询执行:基于生成的执行计划执行SQL语句
- 数据读取:读取数据库中的数据并返回给客户端

上述的SQL解析,是将SQL文本转换为数据库内核能够进行逻辑运算的翻译过程,SQL解析过程主要包括以下几个阶段:
- 词法解析:将SQL语句拆解为单词序列,并识别出关键字、标识、常量等;
- 语法解析:分析器对词法解析出来的单词序列检查语法上是否满足SQL语法规则,通常识别出语法错误问题;
- 语义分析:在语法正确的基础之上进行上下文有关性质的审查,完成表名、操作符、类型等元素的合法性判断,同时检测语义上的二义性问题。
从上述过程中也能看到,如果进入数据库的每一条语句都经历SQL语法语义解析和生成执行计划,也会影响到SQL的执行效率,因此引入了Prepare的机制。
1.1 数据库中的Prepare过程
SQL语句的Prepare操作是优化和提高数据库执行效率的重要步骤,核心是将SQL语句的解析与执行分离,从而提升复杂查询语句、大量重复执行的SQL语句的性能。Prepare 操作是指数据库在执行SQL语句之前,先对语句进行预处理,将其转换为数据库内部的一种中间形式。这一步骤通常包括以下几个子过程:
- 语法解析:验证SQL语句的语法是否正确。例如,检查是否有拼写错误或缺失的关键字。
- 语义解析:检查SQL语句中涉及的表、字段是否存在,以及用户是否有执行这些操作的权限。
- 查询优化:数据库会为给定的SQL语句生成一个最优的执行计划,确定如何读取数据、更有效地处理WHERE条件等。
- 生成执行计划:优化器根据数据统计信息、索引等因素,为该SQL模板生成一个或多个最优的执行计划。
预编译完成后,数据库会返回一个句柄(stmtid)。应用程序后续可以通过这个句柄,仅发送变化的参数(绑定变量)来多次执行该SQL,从而跳过上述耗时的解析和优化步骤,极大地提升了执行效率。
在数据库中使用Prepare预编译有什么好处?除了提升性能以外,还可以提高安全性。对于重复执行的SQL语句,Prepare能够避免每次重新解析和优化的开销,也可以减少网络交互提升性能,对于高并发低时延系统尤为重要。同时,使用 prepare 操作能够自动对输入参数进行转义,防止恶意用户通过输入构造SQL注入攻击。
1.2 数据库中的执行计划缓存
执行计划缓存是在Prepare预编译及SQL重用场景之上设计的,当一个SQL语句经过硬解析(Hard Parse)生成执行计划后,该计划会被存入一个特定的内存区域,即执行计划缓存。

最低0.47元/天 解锁文章
1921

被折叠的 条评论
为什么被折叠?



