一尘不染

在Oracle中,substr或LIKE更快吗?

sql

WHERE substr(my_field,1,6) = 'search'

或者

WHERE my_field LIKE 'search%'

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


阅读 835

收藏
2021-03-17

共1个答案

一尘不染

假设最大的性能是目标,那么我将理想地选择SUBSTR(my_field,1,6)并创建一个基于函数的索引来支持查询。

CREATE INDEX my_substr_idx
    ON my_table( substr( my_field,1,6 ) );

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

如果6是变量(即您有时想搜索前6个字符,有时又想搜索其他数字),则可能无法提出基于函数的索引来支持该查询。在这种情况下,使用LIKE公式可以使优化器的决策变幻莫测。

2021-03-17