Oracle中的substr或LIKE更快?

Bri*_*say 25 sql oracle

WHERE substr(my_field,1,6) = 'search'
Run Code Online (Sandbox Code Playgroud)

要么

WHERE my_field LIKE 'search%'
Run Code Online (Sandbox Code Playgroud)

在Oracle中更快,还是没有区别?

Jus*_*ave 20

假设最高性能是目标,我理想情况下会选择SUBSTR(my_field,1,6)并创建一个基于函数的索引来支持查询.

CREATE INDEX my_substr_idx
    ON my_table( substr( my_field,1,6 ) );
Run Code Online (Sandbox Code Playgroud)

正如其他人指出的那样,SUBSTR(my_field,1,6)无法使用常规索引MY_FIELD.LIKE版本可能使用索引,但在这种情况下优化器的基数估计通常相当差,因此很可能在有用时不使用索引,或者在表扫描更可取时使用索引.索引实际表达式将为优化器提供更多信息,因此更有可能正确选择索引.比我聪明的人可能能够建议一种方法来使用11g中的虚拟列的统计信息来为优化器提供更好的LIKE查询信息.

如果6是一个变量(即你有时想搜索前6个字符,有时想搜索不同的数字),你可能无法想出一个基于函数的索引来支持该查询.在这种情况下,你可能会更好地利用LIKE公式中优化器决策的变幻莫测.


bea*_*ach 10

在提供的两个选项中,绝对是喜欢的.必须对表中的所有行执行substring方法.使用LIKE将允许使用索引.

要检查我的答案,只需分析结果.应该清楚这一天.

  • 同意.但是你可以在SUBSTR(my_field,1,6)上打一个基于函数的索引,这个索引比myike的常规索引更有可能被用作LIKE. (5认同)
  • 这对'搜索'有用,但是如果你想'找'怎么办?SUBSTR(my_field,1,6)上基于函数的索引不起作用.那么你会建议在SUBSTR(my_field,1,4)上添加另一个索引吗?这对我来说似乎是浪费空间.但我想这一切都归结为appdomain以及它将如何被使用.就个人而言,我会安全地玩它并使用LIKE.但是,如果它大大提高了性能,我不会回避特定的SUBSTR()索引.分析和测试确实是推荐的选择.然后根据需要添加索引. (2认同)