这
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';
我的测试表明第二个和第三个示例完全相同。如果是这样,我的问题是,为什么要使用“ =”?
使用绑定变量时,有一个明显的区别,绑定变量应该在Oracle中用于数据仓库或其他批量数据操作以外的其他任何操作。
以下列情况为例:
SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE :b1
Oracle在执行之前不知道:b1的值为’%some_value%’或’some_value’等,因此它将根据启发式方法估计结果的基数,并提出一个合适的计划,可能适合或可能不适合:b的各种值,例如’%A’,’%’,’A’等。
对于相等谓词,类似的问题也可能适用,但是,例如,基于列统计信息或唯一约束的存在,可能导致的基数范围更容易估计。
因此,就我个人而言,我不会开始使用LIKE来代替=。优化器有时很容易被愚弄。