zoukankan      html  css  js  c++  java
  • 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转化成相对应的关系操作符的观点.

  • 相关阅读:
    初始化类的对象时代码的执行顺序
    非原子的 64 位操作
    守护线程
    Redis
    Redis
    Redis
    Redis
    好听美文随手记
    往服务器数据库插入数据报错,在本地数据库测试却无错误。
    关于云服务器中发送邮件,出现无法从传输连接中读取数据:
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11125110.html
Copyright © 2011-2022 走看看