加载中...

预处理语句(Prepared Statement)是数据库提供的两阶段执行机制:先以带占位符(? 或 $1)的 SQL 模板执行 PREPARE,由服务器完成解析与(部分)优化;随后多次 EXECUTE 仅传入参数值。多数数据库协议在二进制层面原生支持。
参数值不参与 SQL 文本拼接,始终作为数据传输,从机制上杜绝了字符串拼接导致的 SQL 注入,是防注入的第一推荐手段,各语言数据访问层(JDBC 的 PreparedStatement、PDO、database/sql)均以其为标准用法。
模板只解析一次,重复执行免去硬解析开销;配合执行计划缓存可复用计划,降低高并发下的 CPU 与优化器争用。Oracle 语境下对应"绑定变量"概念,是其调优的基本功。
计划复用可能引发参数嗅探问题:按通用计划执行对倾斜参数不优。另需注意部分连接池/代理(如某些模式下的 PgBouncer)对命名预处理语句的支持限制,以及占位符不能替代表名、列名等标识符。

登录 后参与讨论
暂无讨论,来发表第一条评论吧