Sql 准备好的声明是如何工作的?说我的查询已编译是什么意思?

Sql 准备好的声明是如何工作的?说我的查询已编译是什么意思?,sql,prepared-statement,Sql,Prepared Statement,我不确定我是否理解一份事先准备好的声明,因为它涉及到速度或效率。我读到一条准备好的语句是在数据库服务器上编译的,可以反复使用 但是,假设我有一个网页。它只执行一个查询。下一个人打开页面,同样的查询,只是该用户的不同参数 在第二次点击网页时,prepared语句是否查看dbms以查看数据库服务器上是否已经存在该特定查询?我不明白这句话是什么意思,它是经过编译的,可以“一遍又一遍”地运行。它不是在每次运行页面时都准备好的吗 此外,这与sql注入无关。这是我理解的与编译相关的一部分 谢谢 编辑:我已经

我不确定我是否理解一份事先准备好的声明,因为它涉及到速度或效率。我读到一条准备好的语句是在数据库服务器上编译的,可以反复使用

但是,假设我有一个网页。它只执行一个查询。下一个人打开页面,同样的查询,只是该用户的不同参数

在第二次点击网页时,prepared语句是否查看dbms以查看数据库服务器上是否已经存在该特定查询?我不明白这句话是什么意思,它是经过编译的,可以“一遍又一遍”地运行。它不是在每次运行页面时都准备好的吗

此外,这与sql注入无关。这是我理解的与编译相关的一部分

谢谢

编辑:我已经搜索过了,但是我找不到答案。我只是被引导到这个问题


编辑:根据下面的评论,考虑到我的场景,我看不到任何效率优势。保安是的。整件事。否。是否有人可以举一个例子来说明是否满足效率问题?

在第一次执行期间创建的查询计划可以由数据库缓存(可能为所有连接到数据库、运行相同查询的应用程序提供好处)或由数据库驱动程序缓存(为应用程序提供好处,只要它不重新启动)。每次执行时仍然会进行“软解析”,但这通常要便宜得多

请注意,您的里程数可能会有所不同,具体取决于数据库类型、驱动程序等。语句缓存通常也是有限的,这意味着缓存中只保留一定数量的语句


提供了一些关于软解析和硬解析之间区别的答案。

我相信,在会话之间会丢弃准备好的查询。不过,我不认为存储过程是这样的-您可以使用这些过程来完成您描述的任务。@arxanas那么编译部分的意义是什么?(减去sql注入)这是一个很好的解释:@jim我读到了。它没有回答我的问题。事实上,它提示了这个问题!基本上这意味着服务器没有在每次运行查询时提出执行计划。这对于存储过程或在同一会话中重复运行同一查询的时间非常有用。Howev呃,如果您的代码为每个用户创建准备好的查询并运行一次,那么没有什么好处。