使用准备好的陈述有缺点吗?

时间:2009-09-01 15:17:09

标签: sql prepared-statement

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

5 个答案:

答案 0 :(得分:8)

Prepared语句只是一个经过解析和预编译的SQL语句,只等待提供的绑定变量才能执行。

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

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

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

例如,

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

答案 1 :(得分:3)

如果您只使用一次语句,或者您自动生成动态sql语句(并且正确地逃避每一项或者确定您的参数只有安全字符),那么您不应该使用预准备语句。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

参见例如

的“备注”部分

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

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

答案 4 :(得分:1)

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