【问题标题】:What is the difference between INSTR and LIKE in Oracle?Oracle 中的 INSTR 和 LIKE 有什么区别?
【发布时间】:2011-12-27 16:02:26
【问题描述】:

有人能告诉我Oracle 中INSTRLIKE 之间的区别吗?

Oracle10g 中哪个更快?

【问题讨论】:

标签: sql oracle oracle10g


【解决方案1】:

这取决于数据和模式。如果您使用like 'a%',那么Oracle 可以使用BTree 索引来查找匹配项,因为它可以搜索以模式开头的btree,然后只考虑子树。

这不适用于LIKE '%a',但您可以通过创建一个计算列来解决此问题,该列反转您要搜索的列中的所有值(这样您就可以得到上面的模式)。

如果您使用散列索引,Oracle 只能扫描整个索引。当只有几个不同的值时,它可能会更快。

我不确定INSTR 是否可以使用索引,因为它没有固定的锚点。

就像所有性能问题一样:

  1. 用一些真实的测试数据填充数据库并运行一些测试。
  2. 当您了解瓶颈
  3. 时,始终以以后可以轻松优化的方式编写代码
  4. 永远不要猜测什么可能会很慢。 90% 的时候你都会错。始终衡量。

【讨论】:

    【解决方案2】:
    • INSTR 在另一个字符串中搜索一个字符串,带有方向、起始位置等选项
    • LIKE 是简单的模式匹配和标准 SQL

    两者都不会始终“更快”,因为它们不可比较:这取决于您需要做什么、您的数据、您的搜索方式等

    【讨论】:

      【解决方案3】:

      INSTR是Oracle 8i以来用于查找子字符串的oracle函数,LIKE是主要用于匹配字符串和通配符的SQL条件。

      我预计 INSTR 会更快一些,因为它不那么复杂,但我没有测量它。

      【讨论】:

      • 也许 INSTR 不太复杂,但语句的性能并不取决于所使用的函数是否或多或少地使用了一些 cpu 周期进行评估,而是取决于必须检索和评估多少数据才能获得结果。
      【解决方案4】:

      【讨论】:

      • 该页面不可用。
      • 感谢您搜索到有效链接。但我也有其他抱怨。在 stackexchange 上只包含链接的答案不受欢迎。链接的相关内容也应该在帖子中呈现。但我认为此链接中提供的测量结果无关紧要。比较是在instr(title,' manual')>0title like'%manual%' 之间进行比较。第一个表达式搜索以“manual”开头的标题,而后者搜索任何地方包含“manual”的标题。
      • 此外,我们被告知该表有 11 个 Mio。行,我们看到经过的时间,我们不知道表的结构,标题字段的长度,没有执行计划,没有统计信息,对测试环境一无所知。这个测试应该被忽略。
      • here is an experiment that has been conducted on a mysql database (并且缺少与您链接中的实验相同的附加信息):结果是没有区别
      • @miracle173 instr(title,'manual')>0 将像like 一样在任何地方搜索具有“手册”的标题。 INSTR documentation
      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 2014-10-20
      • 2019-05-14
      • 2012-05-25
      • 2020-09-17
      • 2010-11-13
      相关资源
      最近更新 更多