索引列的NOT
用法坑,多人一不小心就踩了。Oracle 在遇到NOT
时,会直接放弃索引走全表扫描,这事儿挺容易被忽略的。像DEPT_CODE NOT = 0
这种写法,哪怕建了索引也白搭,效率一下就拉跨了。
索引列的NOT
用法坑,多人一不小心就踩了。Oracle在遇到NOT
时,会直接放弃索引走全表扫描,这事儿挺容易被忽略的。像DEPT_CODE NOT = 0
这种写法,哪怕建了索引也白搭,效率一下就拉跨了。
换种写法就不一样了。比如你用DEPT_CODE > 0
,Oracle 就老老实实用索引走了,响应也快。是不是有点出乎意料?其实本质上NOT
跟在索引列上用函数一个性质——破坏了索引结构。
优化 SQL 时,像NOT IN
、NOT EXISTS
这些也要留神,能不用就别用,或者用改写思路替代掉。尤其是在数据量大的表上,差别挺的,别等慢得像乌龟才想起换写法。
如果你想了解更多关于全表扫描优化的内容,下面这几个文章还蛮有参考价值的:
写 SQL 的时候,别光顾着跑得通,怎么跑、跑多快也重要。尤其是在高并发场景下,写法差一点,DBA 都得头秃。
如果你最近在搞性能优化,记得扫一眼WHERE
条件,有NOT
就多留个心,能重写就重写,能加索引就别浪费。