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

时间:2012-08-15 20:15:54

标签: sql prepared-statement

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

但是,我说有一个网页。它做一个查询。下一个人拉出页面,相同的查询,只为该用户提供不同的参数。

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

此外,这不是关于sql注入。这是我理解的一部分,因为它与编译有关。

感谢。

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

编辑:根据以下评论,鉴于我的方案,我看不到任何效率优势。安全是的。整个编译的东西。没有。有没有人能够举出一个可以满足效率问题的例子?

1 个答案:

答案 0 :(得分:3)

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

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

Ask Tom提供了关于软解析和硬解析之间差异的一些答案。