索引列的NOT用法坑,多人一不小心就踩了。Oracle 在遇到NOT时,会直接放弃索引走全表扫描,这事儿挺容易被忽略的。像DEPT_CODE NOT = 0这种写法,哪怕建了索引也白搭,效率一下就拉跨了。

索引列的NOT用法坑,多人一不小心就踩了。Oracle在遇到NOT时,会直接放弃索引走全表扫描,这事儿挺容易被忽略的。像DEPT_CODE NOT = 0这种写法,哪怕建了索引也白搭,效率一下就拉跨了。

换种写法就不一样了。比如你用DEPT_CODE > 0,Oracle 就老老实实用索引走了,响应也快。是不是有点出乎意料?其实本质上NOT跟在索引列上用函数一个性质——破坏了索引结构。

优化 SQL 时,像NOT INNOT EXISTS这些也要留神,能不用就别用,或者用改写思路替代掉。尤其是在数据量大的表上,差别挺的,别等慢得像乌龟才想起换写法。

如果你想了解更多关于全表扫描优化的内容,下面这几个文章还蛮有参考价值的:

写 SQL 的时候,别光顾着跑得通,怎么跑、跑多快也重要。尤其是在高并发场景下,写法差一点,DBA 都得头秃。

如果你最近在搞性能优化,记得扫一眼WHERE条件,有NOT就多留个心,能重写就重写,能加索引就别浪费。