PreparedStatement, CallableStatement vs Statement - 是 Statem



执行PreparedStatementCallableStatement会导致与仅将完全相同的查询作为Statement执行不同的查询优化吗?也就是说,查询优化是否取决于用于执行语句的类?

PreparedStatementCallableStatement总是Statement快吗?

我对性能非常感兴趣,而不是对可移植性等其他好处感兴趣。

与性能相关的主要问题是解析 SQL 语句(包括检查表和列是否存在(和创建优化的执行计划的成本很高。如果缓存的执行计划可以重用,则执行速度通常更快。

因此,这些问题也可以改写为:我是否需要使用PreparedStatement(和CallableStatement(才能重用缓存的执行计划?

答案取决于您的数据库系统。

某些系统(如 Oracle((在其默认设置和推荐设置中(需要PreparedStatement重用执行计划。否则,每当查询中的单个值发生更改时,它将重新分析整个查询(也称为硬解析(。更糟糕的是,当新查询及其计划将添加到缓存中时,需要从缓存中逐出其他内容。因此,它还会对使用预准备语句的其他数据库客户端产生负面影响。

其他系统(如 SQL Server(并不完全依赖于准备好的查询。对于未准备好的查询,他们将猜测哪些值应转换为参数,将创建一个执行计划并将其缓存。如果另一个未准备的查询与先前参数化的查询匹配,则可以重用该计划。当懒惰的程序员不始终如一地使用准备好的查询时,这种方法非常有用。但它没有达到准备好的查询的全部速度,因为参数化和匹配需要更多时间,并且生成的执行计划可能具有太多参数,过于通用,因此次优。

你不想听,但我还是要说:准备好的语句是对抗SQL注入攻击的最佳方法。

最新更新