一尘不染

使用LIKE'string'vs ='string'对Oracle的性能有何影响?

sql

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE '%some_value%';

比这慢

SELECT * FROM SOME_TABLE WHERE SOME_FIELD = 'some_value';

但是呢?

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE 'some_value';

我的测试表明第二个和第三个示例完全相同。如果是这样,我的问题是,为什么要使用“ =”?


阅读 146

收藏
2021-03-10

共1个答案

一尘不染

使用绑定变量时,有一个明显的区别,绑定变量应该在Oracle中用于数据仓库或其他批量数据操作以外的其他任何操作。

以下列情况为例:

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE :b1

Oracle在执行之前不知道:b1的值为’%some_value%’或’some_value’等,因此它将根据启发式方法估计结果的基数,并提出一个合适的计划,可能适合或可能不适合:b的各种值,例如’%A’,’%’,’A’等。

对于相等谓词,类似的问题也可能适用,但是,例如,基于列统计信息或唯一约束的存在,可能导致的基数范围更容易估计。

因此,就我个人而言,我不会开始使用LIKE来代替=。优化器有时很容易被愚弄。

2021-03-10