就好像 ?”效率比LIKE'%'||?||'%'更高效

时间:2010-06-29 16:05:20

标签: java sql db2

最近我的一位同事发表评论说我不应该使用

  

LIKE'%'||?||'%'

宁愿使用

  

喜欢?

在SQL中

然后替换 LIKE?在执行SQL之前,使用LIKE'%'||?||'%'标记。他指出,使用单个参数标记,DB2数据库将始终缓存该语句,从而减少SQL准备时间。

但是,我不确定它是否准确。对我而言应该是另一种方式,因为我们每次执行查询时都通过对SQL执行字符串替换来执行更多处理。

有人知道单个标记是否真的加快执行速度?仅供参考 - 我使用的是Spring 2.5 JDBC框架,DB2版本是9.2。

我的问题是 - DB2是否对待“LIKE?”与“LIKE'%'||?||'%'”不同,就缓存和准备工作而言。

3 个答案:

答案 0 :(得分:2)

'喜欢?'是PreparedStatement。准备好的语句是JDBC驱动程序级别的优化。我们的想法是数据库分析查询以决定如何最有效地处理它们。然后,DB可以缓存生成的查询计划,并在完整语句上键入。重用相同的语句会重用查询计划。所以基本上如果你使用不同的比较字符串多次运行相同的查询,并且如果查询计划保持缓存,那么是,使用“LIKE?”会更快。

关于PreparedStatements的一些有用(虽然有些过时)信息:

答案 1 :(得分:1)

我没有做太多的DB2,不是从90年代开始,我不确定我是否理解你的基本问题是什么。当时我接到了DBA团队负责人的电话。 “你在做什么不同于我们所有的其他程序员!??”请注意,这是我职业生涯的早期,所以暂时我回答说,“没什么......”,想象它有点发出嘶哑的声音。 “那么,为什么你的查询占用了其他任何人的50%的cpu资源?”。我对所有其他人进行了快速调查,发现我是唯一使用预备语句的人。现在,Spring将自动生成预处理语句,并且他们多年来在数据库中改进了语句缓存,但如果你正确使用它,你可以在那里获得加速,并且它将使语句缓存不常交换东西。这实际上取决于你的用例,如果你只打算查询一次,那么就没有差别,如果它只有几千次,显然会产生更大的差异。

答案 2 :(得分:1)

  

在SQL中然后替换LIKE?在执行SQL之前,使用LIKE'%'||?||'%'标记。他指出,使用单个参数标记,DB2数据库将始终缓存该语句,从而减少SQL准备时间。

除非DB2是某种奇怪的外来SQL数据库,或者如果它的驱动程序做了一些疯狂的事情,那么数据库服务器将永远不会看到您准备好的语句,直到您实际执行它。因此,您可以整天在PreparedStatement中交换子句,直到您在执行它时将其实际发送到服务器时才会生效。