预准备语句
自 3.2 版本起,StarRocks 提供预准备语句(prepared statement),用于多次执行结构相同、仅部分变量不同的 SQL 语句,能显著提升执行效率,并且还能防止 SQL 注入。
功能
工作流程
- 预准备:准备 SQL 语句。语句中的变量用占位符
?
表示。FE 解析语句并生成执行计划。 - 执行:声明变量后,将变量传递至语句中并执行语句。并且可以使用不同的变量多次执行该语句。
优势
- 节省解析 SQL 语句的开销。业务中应用程序通常会使用不同变量多次执行结构相同的语句。使用预准备语句后,StarRocks 只需要在预准备阶段解析一次语句,后续多次执行相同语句(变量不同)时直接使用解析结果,因此能显著提高语句(特别是复杂语句)执行性能。
- 防止 SQL 注入攻击。分离了语句和变量,将用户输入的数据作为参数进行传递,而不是将其直接拼接到语句中。这样可以防止恶意用户利用输入来执行恶意的 SQL 代码。
使用说明
预准备语句仅在当前会话中生效,不适用于其他会话。当前会话退出后,所创建预准备语句会自动删除。
语法
预准备语句如下:
- PREPARE:准备 SQL 语句,语句中变量用占位符
?
表示。 - SET:声明语句中的变量。
- EXECUTE:传递已声明的变量并执行语句。
- DROP PREPARE 或 DEALLOCATE PREPARE:删除预准备语句。
PREPARE
语法:
PREPARE <stmt_name> FROM <preparable_stmt>
参数说明:
stmt_name
:为预准备语句赋予一个名称,以便后续执行和删除语句时引用。该名称在单个会话内必须是唯一的。preparable_stmt
:需要进行预准备的 SQL 语句。注意,目前仅支持SELECT
语句。其中的变量占位符为英文半角问号 (?
)。
示例:
准备一个 SELECT
语句,其中变量用 ?
占位。并为该语句赋予一个名称 select_by_id_stmt
。
PREPARE select_by_id_stmt FROM 'SELECT * FROM users WHERE id = ?';
SET
语法:
SET @var_name = expr [, ...];
参数说明:
var_name
:自定义变量名称。expr
:自定义变量。
示例:
声明变量。
SET @id1 = 1, @id2 = 2;
详细信息,请参见用户自定义变量。
EXECUTE
语法:
EXECUTE <stmt_name> [USING @var_name [, @var_name] ...]
参数说明:
var_name
:在SET
语句中已声明的变量名称。stmt_name
:预准备语句名称。
示例:
传递变量并执行 SELECT
语句。
EXECUTE select_by_id_stmt USING @id1;