13

我一直在阅读很多关于准备好的陈述,在我读过的所有内容中,没有人谈论使用它们的缺点。因此,我想知道是否有任何人们容易忽视的“有龙”的地方?

4

5 回答 5

8

准备好的语句只是一个解析和预编译的SQL语句,它只是等待提供的绑定变量被执行。

任何执行的语句迟早都会准备好(需要解析、优化、编译然后执行)。

准备好的语句只是重用解析、优化和编译的结果。

通常数据库系统使用某种优化来节省查询准备时间,即使您自己不使用准备好的查询。

Oracle,例如,在解析查询时首先检查库缓存,如果相同的语句已经被解析,它会使用缓存的执行计划。

于 2009-09-01T15:20:41.960 回答
3

如果您只使用一次语句,或者如果您自动生成动态 sql 语句(并且正确地转义所有内容或确定您的参数只有安全字符),那么您不应该使用准备好的语句。

于 2009-09-01T15:25:12.870 回答
3

准备好的语句与动态 sql 相比还有一个小问题,那就是调试它们可能更难。使用动态 sql,您始终可以将问题查询写入日志文件并直接在服务器上运行,就像您的程序看到的一样。使用准备好的语句,可能需要更多的工作来使用从崩溃数据确定的一组特定参数来测试您的查询。但仅此而已,额外的安全性绝对证明了成本是合理的。

于 2009-09-01T15:38:52.267 回答
2

在某些情况下,数据库引擎在使用准备好的语句时可能会提出较差的查询计划(因为如果没有搜索的实际绑定值,它就无法做出正确的假设)。

参见例如“注释”部分

http://www.postgresql.org/docs/current/static/sql-prepare.html

因此,可能值得在准备语句和不准备语句的情况下测试您的查询,以找出哪个更快。理想情况下,您将根据每个语句决定是否使用准备好的语句,尽管并非所有 ORM 都允许您这样做。

于 2011-10-18T08:02:40.823 回答
1

我能想到的唯一缺点是它们占用了服务器上的内存。这并不多,但可能有一些边缘情况会成为问题,但我很难想到任何问题。

于 2009-09-01T15:31:09.770 回答