oracle避免在索引列上使用NOT
通常, 我们要避免在索引列上使用NOT,NOT会产生在和在索引列上使用函数相同的 影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描. ?? 举例: ?? 低效: (这里,不使用索引) ?? SELECT … ?? FROM DEPT ?? WHERE DEPT_CODE NOT = 0; ?? ?? 高效: (这里,使用了索引) ? SELECT … ?? FROM DEPT ?? WHERE DEPT_CODE > 0; ?? 需要注意的是,在某些时候,ORACLE优化器会自动将NOT转化成相对应的关系操作符. ?? NOT >? to? <= ?? NOT >=? to? < ?? NOT <? to? >= ?? NOT <=? to? > ? ???? 在这个例子中,作者犯了一些错误. 例子中的低效率SQL是不能被执行的. 我做了一些测试: ???? SQL> select * from emp where NOT empno > 1; no rows selected Execution Plan ---------------------------------------------------------- ?? 0????? SELECT STATEMENT Optimizer=CHOOSE ?? 1??? 0?? TABLE ACCESS (BY INDEX ROWID) OF ‘EMP‘ ?? 2??? 1???? INDEX (RANGE SCAN) OF ‘EMPNO‘ (UNIQUE)???? SQL> select * from emp where empno <= 1; no rows selected Execution Plan ---------------------------------------------------------- ?? 0????? SELECT STATEMENT Optimizer=CHOOSE ?? 1??? 0?? TABLE ACCESS (BY INDEX ROWID) OF ‘EMP‘ ?? 2??? 1???? INDEX (RANGE SCAN) OF ‘EMPNO‘ (UNIQUE) ????? 两者的效率完全一样,也许这符合作者关于” 在某些时候,ORACLE优化器会自动将NOT转化成相对应的关系操作符” 的观点. (编辑:淮安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |