一個600萬條記錄的表TabA,需要執行一個含有like的語句:
select count(*) from TabA where FieldB like 'R01%';
原始情況下,大約需要1分鍾時間。檢查執行計划,是走全表掃描。
因為like是從頭部開始,將FieldB加上索引,執行計划顯示利用了索引,實際運行時間降到5秒多。
此時,有人建議改用instr函數代替,語句為:
select count(*) from TabA where instr(FieldB, 'R01%')=1;
講真,一開始本人是不相信的,因為執行計划顯示沒有利用索引,又走了全表掃描。但實際結果卻是:用時只有1秒左右,大大出乎意料。
網上搜索,才發現早有很多的類似案例,而且在替代like 'xxx%'、like '%xxx%'、not like...等情況時都能提升效率。
看來確實是我孤陋寡聞,也說明只看執行計划並不可靠。
PS:經實踐檢測,又發現此經驗並非在任何環境都靈驗,有些環境下依然是like 'xxx%'(用索引)的效率更高。