我有这样的SQL查询。
select * from table where owner='b' value=? and chanel='5'
我将始终只使用所有者b和chanel 5进行搜索,将其保留为如下所示的占位符是否有意义。
select * from table where owner=? and value=? and chanel=?
它是否会提高性能还是有任何优势?
亚当。
答案 0 :(得分:1)
Oracle可以在第一个问题中使用额外信息,因此可以更好地优化它。
它是否会产生明显的差异?取决于您的数据和索引。 在大多数情况下,没有明显的差异,或者第一个会稍快一些。
在某些特定情况下(特别是如果统计数据不是最新的),第一种形式可能会表现更差。 (例如,见Oracle SQL: additional restriction causes performance issues)
答案 1 :(得分:0)
我认为性能优势可以忽略不计,但使用占位符的安全性好处可能很大。真正的绩效表现将来自重新使用PreparedStatement(而不是为每个查询创建一个)。
考虑“b”和“5”来自用户的情况(例如,Web应用程序中的请求参数)。如果使用字符串连接创建了字符串,则会将应用程序打开到SQL Injection次攻击。使用占位符可以保护您的应用免受SQL注入攻击。
这幅漫画很好地解释了这个问题:http://xkcd.com/327/
答案 2 :(得分:0)
准备好的语句确实可以提高性能,但前提是您要在项目中多次使用相同的查询。
但它也带来了诸如避免SQL注入等优点,并允许您将特定于数据库的所有内容集中到数据库管理类中。如果从Oracle更改为其他内容,您只需更改代码中的一个类。
这个相同的数据库管理类可以在程序启动时初始化所有准备好的语句,这样它们就可以在以后需要时准备好,从而获得性能。
Here is an exemple使用此模型的开源项目。这是C ++,但可能会给你一个想法。
答案 3 :(得分:0)
使用文字的一些好处:
LIKE
谓词。如果你的一个非真正绑定变量为真正的绑定变量禁用了这个特性,它可能会导致问题。KEY
,这不会明确哪个文字的明显缺点,你可能已经考虑过了: