2011-12-27 77 views
4

有人能告诉我在Oracle中INSTRLIKE之间的区别吗?Oracle中的INSTR和LIKE有什么区别?

Oracle10g中哪一个更快?

+0

另请参阅http://stackoverflow.com/questions/1197026/is-substr-or-like-faster-in-oracle – Vadzim 2016-12-13 11:38:55

+0

对于[MySql](https://stackoverflow.com/questions/2451608/which-是更快的instr或者像这样[回复](https://stackoverflow.com/a/22171511/480894)说INSTR更快。 – Roland 2017-06-13 11:27:28

回答

7

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

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

如果使用散列索引,那么Oracle可以做的事情很少,但是需要扫描整个索引。只有几个不同的值时,它可能会更快。

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

因此,像所有的性能问题:

  1. 填写一些真实的测试数据的数据库,并运行一些测试。
  2. 始终编写代码的方式,它可以很容易地以后进行优化,当你知道有关瓶颈
  3. 决不猜测可能是缓慢的。 90%的时间你会错的。始终测量。
+1

+1为你错了90%的时间 – rene 2011-12-27 16:10:22

+0

看到我的回答(INSTR更快):http://stackoverflow.com/a/30781872/480894 – Roland 2015-06-11 13:14:59

2

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

我希望INSTR稍微快一点,因为它不那么复杂,但我没有测量它。

+0

也许INSTR不那么复杂,但是语句的性能并不取决于所使用的函数是多少使用一些cpu周期来评估,而是从必须检索和评估多少数据来获得结果。 – miracle173 2017-06-09 05:47:42

3
  • INSTR搜索某个字符串在另一字符串,与方向开始位置的选择等
  • LIKE是简单的模式匹配和标准SQL

无论是将“更快”,始终坚持,因为他们不具有可比性:这取决于你需要做什么,你的数据,你如何搜索等

1
+0

该页面不可用。 – miracle173 2017-06-09 05:32:13

+0

谢谢您搜索了有效链接。但我也有其他的抱怨。不支持仅包含链接的stackexchange答案。链接的相关内容也应在帖子中提供。但我认为在这个环节提出的测量是没有意义的。 'instr(title,'manual')> 0'和'title manual%'这样的标题之间的比较。第一个表达式搜索以'manual'开头的标题,后者搜索包含'manual'的标题。 – miracle173 2017-06-13 06:28:40

+0

除此之外,我们被告知该表有11个Mio。行,我们可以看到流逝的时间,我们不知道表的结构,标题字段的长度,没有执行计划,没有统计,没有关于测试环境。这个测试应该被忽略。 – miracle173 2017-06-13 06:29:03