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