zoukankan      html  css  js  c++  java
  • SQL基础--索引

    索引的概念:

      在数据库中索引是用于提升数据库查询操作性能的一种手段,但在频繁更新的表上,索引反而会降低性能。

    常用的索引结构:

    •   B*树索引
    •   位图索引

    B树索引:

      B书索引是最基本的索引结构,Oracle中默认建立的索引类型就是此类型索引,

      一般B数索引在检索高基数数列(该例重复内容较少或没有)的时候可以提供高性能检索

      B书索引采用的就是用的二叉树排列,在叶子节点中有ROWID的值,用ROWID这种方式查询效率是最高的。

     B树索引建立语法:

      create index  [用户名.]索引名称  on [用户名.]表名称 (列名称  [asc|desc])

       --默认是ASC

    演示:

    --没有建立索引的查询:

    SQL> set autotrace on     ##开启自动跟踪功能
    SQL> select * from scott.emp where sal<1500;

    结果:

    已用时间:  00: 00: 00.02
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 3956160932
    
    --------------------------------------------------------------------------
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |     |     7 |   252 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| EMP  |     7 |   252 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter("SAL"<1500)
    
    
    统计信息
    ----------------------------------------------------------
          1  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
           1220  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          5  rows processed

    从中可以看出用了全盘扫描

    --建立B数索引

    SQL> create index emp_sal_ind on emp(sal);

    再次追踪:

    已用时间:  00: 00: 00.01
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 317084801
    
    -------------------------------------------------------------------------------------------
    | Id  | Operation            | Name      | Rows  | Bytes | Cost (%CPU)| Time      |
    -------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT        |          |    7 |   252 |    2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| EMP      |    7 |   252 |    2   (0)| 00:00:01 |
    |*  2 |   INDEX RANGE SCAN        | EMP_SAL_IND |    7 |      |    1   (0)| 00:00:01 |
    -------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("SAL"<1500)
    
    
    统计信息
    ----------------------------------------------------------
          0  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
           1238  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          5  rows processed

     对比上面没建立索引的,可以看出耗费时间和CPU都减少了。

    查询用户的索引视图

      --user_indexes

    SQL> select index_name,index_type,status  from user_indexes;
    
    Index name               Index type      STATUS
    ------------------------------ --------------- --------
    PK_MID                   NORMAL           VALID
    PK_EMP                   NORMAL           VALID
    EMP_SAL_IND               NORMAL           VALID
    PK_DEPT                NORMAL           VALID

    主键都自动设置了索引。

      --user_ind_columns

    查看索引建在哪个字段上

    SQL> select * from user_ind_columns where index_name='EMP_SAL_IND';
     
    INDEX_NAME     TABLE_NAME          COLUMN_NAME         COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESCEND
    ------------------------------ ------------------------------ -----------------------------------------------
    EMP_SAL_IND       EMP               SAL                       1            22           0       ASC
     

    位图索引

      适用于低基数列,重复的数据多

    创建语法:

      create bitmp index  [用户名.]索引名称  on [用户名.]表名称 (列名称  [asc|desc])

    实例:

      --在deptno上建立位图索引

    SQL> create bitmap index emp_deptno_ind on emp(deptno);

    删除索引:

      由于索引本身要进行数据维护,一般而言会占用较大的磁盘空间,随着表的增长会越来越大,对于那些不经常使用的索引应该删除。

    删除语法:

      drop index 索引名称;

  • 相关阅读:
    Andriod ADT v22.6.2版本中在Mainactivity.java中使用fragment_main.xml中TextView控件对象的问题
    SQL学习:查询的用法(1)
    SQL学习:主键,外键,主键表,外键表,数据库的表与表之间的关系;
    HTML基础(2) 格式标签 文本标签
    2013年10月15日数据库学习:约束
    HTML基础(1) 全局架构标签,特殊字符
    2013年10月13日学习:SQL通过命令语句来创建表
    2013年10月13日学习:SQL通过图形化界面创建表
    Tomcat和Nutch的安装
    sqlserver 处理连接池问题
  • 原文地址:https://www.cnblogs.com/zydev/p/6258213.html
Copyright © 2011-2022 走看看