zoukankan      html  css  js  c++  java
  • oracle中的索引

    语法结构:创建索引
    CREATE [UNIQUE] INDEX index_name ON table_name(column_name[,column_name…])
    语法解析:
    1. UNIQUE:指定索引列上的值必须是唯一的。称为唯一索引。
    2. index_name:指定索引名。
    3. tabl_name:指定要为哪个表创建索引。
    4. column_name:指定要对哪个列创建索引。我们也可以对多列创建索引;这种索引称为组合索引。
    案例4:为EMP表的ENAME列创建创建唯一索引,为EMP表的工资列创建普通索引,把JOB列先变为小写再创建索引。

    代码示例:
    SQL> CREATE UNIQUE INDEX UQ_ENAME_IDX ON EMP(ENAME); ①
    Index created
    SQL> CREATE INDEX IDX_SAL ON EMP(SAL); ②
    Index created
    SQL> CREATE INDEX IDX_JOB_LOWER ON EMP(LOWER(JOB)); ③
    Index created

    CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique表示唯一索引
    ON table_name([column1 [ASC|DESC],column2 --bitmap,创建位图索引
    [ASC|DESC],…] | [express])
    [TABLESPACE tablespace_name]
    [PCTFREE n1] --指定索引在数据块中空闲空间
    [STORAGE (INITIAL n2)]
    [NOLOGGING] --表示创建和重建索引时允许对表做DML操作,默认情况下不应该使用
    [NOLINE]
    [NOSORT]; --表示创建索引时不进行排序,默认不适用,如果数据已经是按照该索引顺序排列的可以使用

    alter index index_sno rename to bitmap_index; --重命名索引
    alter index index_sno coalesce; --合并索引
    drop index index_sno;

    索引分类
    1. B树索引(默认索引,保存讲过排序过的索引列和对应的rowid值)
    1)说明:
      1.oracle中最常用的索引;B树索引就是一颗二叉树;叶子节点(双向链表)包含索引列和指向表中每个匹配行的ROWID值
      2.所有叶子节点具有相同的深度,因而不管查询条件怎样,查询速度基本相同
      3.能够适应精确查询、模糊查询和比较查询
    2)分类:
       UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)
    3)创建例子
    craete index index_sno on student('sno');

    4)适合使用场景:
      列基数(列不重复值的个数)大时适合使用B数索引
      
    2. 位图索引
    1)说明:
      1.创建位图索引时,oracle会扫描整张表,并为索引列的每个取值建立一个位图(位图中,对表中每一行 使用一位(bit,0或者1)来标识该行是否包含该位图的索引列的取值,如果为1,表示对应的rowid所在的记录包含该位图索引列值),最后通过位图索 引中的映射函数完成位到行的ROWID的转换
    2)创建例子
    create bitmap index index_sno on student(sno);
    3) 适合场景:
    对于基数小的列适合简历位图索引(例如性别等)

    3.单列索引和复合索引(基于多个列创建)
    1) 注意:
      即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引,即至少要包含组合索引的第一列

    4. 函数索引
    1)说明:
      1. 当经常要访问一些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度
      2. 函数索引既可以使用B数索引,也可以使用位图索引;当函数结果不确定时采用B树索引,结果是固定的某几个值时使用位图索引
      3. 函数索引中可以水泥用len、trim、substr、upper(每行返回独立结果),不能使用如sum、max、min、avg等

    2)例子:
    create index fbi on student (upper(name));
    select * from student where upper(name) ='WISH';

    索引建立原则总结
      1. 如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引
      2. 至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)
      3. 小表不要简历索引
      4. 对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引
      5. 列中有很多空值,但经常查询该列上非空记录时应该建立索引
      6. 经常进行连接查询的列应该创建索引
      7. 使用create index时要将最常查询的列放在最前面
      8. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引
      9.限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)

  • 相关阅读:
    LeetCode 382. Linked List Random Node
    LeetCode 398. Random Pick Index
    LeetCode 1002. Find Common Characters
    LeetCode 498. Diagonal Traverse
    LeetCode 825. Friends Of Appropriate Ages
    LeetCode 824. Goat Latin
    LeetCode 896. Monotonic Array
    LeetCode 987. Vertical Order Traversal of a Binary Tree
    LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
    LeetCode 636. Exclusive Time of Functions
  • 原文地址:https://www.cnblogs.com/caomj/p/10751399.html
Copyright © 2011-2022 走看看