zoukankan      html  css  js  c++  java
  • oracle索引失效总结

    --oracle索引失效
    --创建测试表
    create table t(
    empno number,
    ename varchar2(20),
    deptno number
    );
    --创建索引
    create index idx_deptno on t(deptno);
    --创建复合索引
    create index idx_empno_deptno on t(empno,deptno);
    drop index idx_empno_deptno;
    create index idx_empno_deptno on t(deptno,empno);
    --插入测试数据
    insert into t values(1001,'A',10);
    
    1    <> 
    SQL> select * from t where deptno=10;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3776569808
    
    ------------------------------------------------------------------------------------------
    | Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT        |         |     2 |    76 |     1   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| T      |     2 |    76 |     1   (0)| 00:00:01 |
    |*  2 |   INDEX RANGE SCAN        | IDX_DEPTNO |     2 |     |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------------
    
    
    SQL> select * from t where deptno<>10;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
    
    --------------------------------------------------------------------------
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |     |     7 |   266 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T     |     7 |   266 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
       
    2 模糊查询 like '%_' 
    SQL> select * from t where deptno like '%_1';     
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
    
    --------------------------------------------------------------------------
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |     |     1 |    38 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T     |     1 |    38 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
    3 单独引用复合索引里非第一位置的索引列.
    SQL> select * from t where empno=1005;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
    
    --------------------------------------------------------------------------
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |     |     1 |    38 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T     |     1 |    38 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
    4 字符型字段为数字时在where条件里不添加引号
    alter table t add id varchar2(20);
    create index idx_id on t(id);
    SQL> select * from t where id=33;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
    
    --------------------------------------------------------------------------
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |     |     1 |    50 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T     |     1 |    50 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
    SQL> select * from t where id='33';
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 827754323
    
    --------------------------------------------------------------------------------------
    | Id  | Operation            | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT        |         |       1 |      50 |       2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| T      |       1 |      50 |       2   (0)| 00:00:01 |
    |*  2 |   INDEX RANGE SCAN        | IDX_ID |       1 |         |       1   (0)| 00:00:01 |
    --------------------------------------------------------------------------------------
    
    5 对索引列进行运算.需要建立函数索引
    SQL> select * from t where deptno*2=20;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
    
    --------------------------------------------------------------------------
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |     |     2 |   100 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T     |     2 |   100 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
    SQL> select * from t where substr(deptno,1,1)=3;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
    
    --------------------------------------------------------------------------
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |     |     1 |    50 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T     |     1 |    50 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
    6 not in ,not exist.
    SQL> select * from t where deptno not in ('10','20','30','40','50','60');
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
    
    --------------------------------------------------------------------------
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |     |     3 |   150 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T     |     3 |   150 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
    7 基于cost成本分析(oracle因为走全表成本会更小):查询小表,或者返回值大概在10%以上
    8 B-tree索引 is null不会走,is not null会走
    SQL> select * from t where id is null;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1601196873
    
    --------------------------------------------------------------------------
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |     |     7 |   350 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T     |     7 |   350 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
    SQL> select * from t where id is not null;
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 875909553
    
    --------------------------------------------------------------------------------------
    | Id  | Operation            | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT        |         |       3 |     150 |       2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| T      |       3 |     150 |       2   (0)| 00:00:01 |
    |*  2 |   INDEX FULL SCAN        | IDX_ID |      10 |         |       1   (0)| 00:00:01 |
    --------------------------------------------------------------------------------------
    
    索引失效总结:
    1.没有查询条件,查询条件没有建立索引
    2.查询条件没有使用索引引导列
    3.基于cost优化器,查询结果集30%以上
    4.索引本身失效
    5.查询条件使用函数在索引列上
    6.隐式转换
    7.模糊查询
    8.not in , null ,<> 
  • 相关阅读:
    GB50174-2008《电子信息系统机房设计规范》
    Tickets HDU
    HDU
    [长期更新]题解合集
    网络流/费用流题目总结[持续更新]
    [转载]Maximum Flow: Augmenting Path Algorithms Comparison
    [转载]网络流笔记
    网络流各类算法简单总结与比较
    简单的算法备忘录,个人总结[长期更新]
    训练报告 18春组队04 2014西安全国邀请赛
  • 原文地址:https://www.cnblogs.com/wangzihong/p/9769129.html
Copyright © 2011-2022 走看看