1

我有一个这样的 sql 查询。

select * from table where owner='b' value=? and chanel='5'

我将始终仅与所有者 b 和 chanel 5 一起搜索,将其保留为如下所示的占位符是否有意义。

select * from table where owner=? and value=? and chanel=?

它会提高性能还是有任何优势?

亚当。

4

4 回答 4

1

Oracle 可以使用第一个问题中的额外信息,因此它可能会更好地优化它。

它会产生显着的不同吗?取决于您的数据和索引。在大多数情况下,不会有明显的差异,或者第一个会稍微快一些。

在某些特定情况下(特别是如果统计信息不是最新的),第一种形式的表现可能会更差。(例如见Oracle SQL:附加限制导致性能问题

于 2013-11-06T16:30:02.210 回答
0

准备好的语句确实可以提高性能,但前提是您要在项目中多次使用相同的查询。

但它也带来了避免 SQL 注入等优点,并允许您将所有特定于数据库的内容集中到数据库管理类中。如果从 Oracle 更改为其他内容,您只需更改代码中的一个类。

这个相同的数据库管理类可以在您的程序启动时初始化所有准备好的语句,以便在您以后需要时随时准备好它们,从而获得性能。

这是一个使用此模型的开源项目的示例。它是 C++,但可能会给你一个想法。

于 2013-11-06T16:28:25.683 回答
0

我认为性能优势可以忽略不计,但使用占位符的安全优势可能很大。真正的性能改进将来自于重用PreparedStatement(而不是为每个查询创建一个)。

考虑“b”和“5”来自用户的情况(例如,Web 应用程序中的请求参数)。如果您使用字符串连接创建了字符串,您的应用程序就会受到SQL 注入攻击。使用占位符可以保护您的应用免受 SQL 注入攻击。

这幅漫画很好地解释了这个问题:http: //xkcd.com/327/

于 2013-11-06T16:26:07.247 回答
0

使用文字的一些优点:

  1. 避免奇怪的优化器限制和错误。 这是尽可能使用文字的主要原因。Oracle 可以使用自适应游标共享为同一 SQL 语句构建不同的计划,具体取决于绑定变量的值。构建基于绑定值更改的计划很困难,并且存在许多限制和错误。例如,它最多只支持 14 个绑定变量,不支持LIKE谓词。如果您的一个非真正绑定变量为真正的绑定变量禁用了此功能,则可能会导致问题。
  2. 语句更容易阅读。 特别是对于从 V$SQL 查看语句的 DBA。将绑定信息添加到查询是额外的工作,有时该数据不可用。它可能使解释计划更容易生成和阅读。例如,使用文字,解释计划可能会显示正在使用的确切分区。使用绑定变量,它可能只显示KEY,这不会清楚地表明哪个
  3. 性能小幅提升。 我不确切知道优化器是如何工作的,但可以肯定的是,它必须存储绑定变量并查找它们以比较用于现有计划的值。避免这些查找应该会有所帮助,尽管差异可能非常小。

文字的明显缺点,您可能已经考虑过:

  1. 如果您只是直接从用户插入数据,则可能存在 SQL 注入。
  2. 如果您想稍后更改代码,则不那么灵活。
于 2013-11-07T19:06:05.027 回答