• oracle学习篇十二:索引


    索引:

    查询User_indexes可以获取有关用户已创建的索引的详细信息。
    查询User_ind_partitions可以获取有关用户已创建的分区索引的详细信息。
    查询User_ind_columns可以获取有关列(用户的索引是基于这些列创建的)的详细信息。

    索引类型:唯一索引、组合索引、反向键索引、位图索引和基于函数的索引。

    索引在逻辑上物理上都独立于关联表中的数据,在任何时候都可以创建或删除索引,而不会影响基表或其它索引。

    1.创建普通索引的语法:
    Create INDEX index_name ON table_name(column_list) [TABLESPACE tablespace_name];

    其中:
    index_name 指所创建索引的名称。
    table_name 表示为之创建索引的表名。
    column_list 是在其上创建索引的列名列表,可以基于多列创建索引。
    tablespace_name 为索引指定表空间。

    示例12:演示如何在itemfile表的itemcode列上创建索引
    create index item_index on itemfile(itemcode);

    2.ALTER INDEX语句的REBUILD选项可以用来重建现有的索引。该选项提供的性能要优于使用DROP INDEX和CREATE INDEX语句重新创建索引。

    示例13:重建索引
    ALTER INDEX item_index REBUILD;

    删除索引语法:Drop INDEX item_index;

    (1)唯一索引:此索引可以确保在定义索引的列中,表的任意两行的值都不相同。Oracle自动为表的主键列创建唯一索引。
    可以使用Create UNIQUE INDEX命令明确地创建唯一索引。

    示例14:在itemfile表的itemcode列上创建了一个名为item_index的唯一索引。
    Create UNIQUE INDEX item_index ON itemfile(itemcode);

    (2)组合索引:组合索引是在表中的多个列上创建的索引。组合索引中列的顺序是任意的,不必是表中相邻的列。
    创建组合索引时,应注意定义中使用的列的顺序。通常,最频繁访问的列应放置在列表的最前面。

    示例15:在itemfile表上创建了一个名为comp_index的组合索引,当查询该表的的WHERE子句同时包含这两个列或只包含
    p_category列时,以下示例语句创建的索引将用于检索数据,但如果单独使用itemrate列,则索引不能用于检索数据。
    Create INDEX comp_index ON itemfile(p_category,itemrate);

    (3)反向键索引:通常建立在一些值连续增长的列上,例如列中的值是是由序列产生的情况。
    示例16:在itemfile表上创建了一个名为rev_index的反向键索引。注意使用REVERSE关键字。
    Create INDEX rev_index ON itemfile(itemcode) REVERSE;

    示例17:使用关键字NOREVERSE可以将反向键索引重建为标准索引。
    ALTER INDEX rev_index REBUILD NOREVERSE;
    注意:不能将标准索引重建为反向键索引。

    (4)位图索引:如果某个列的值重复超过一百次,则可以考虑在该列上创建位图索引。
    示例18:itemcode是order_detail表中的低基数列,因为货物编码在大多数订单中都是重复的,因此适合在该列上创建位图索引。
    Create BITMAP INDEX bit_ind1 ON order_detail(itemcode);
    位图索引不应当用在频繁发生的INSERT,UPDATE,DELETE操作的表上。位图索引最适合于数据仓库和决策支持系统。

    (5)索引组织表:索引组织表与在一个或多个列上建立索引的普通表相似,但它无需为表和索引维护两个单独的存储空间,
    数据库系统仅维护一个索引,该索引包含相应的已编码键值和与其关联的列值。
    示例19:使用ORGANIZATION INDEX子句来创建索引组织表。
    Create table ind_org_tab
    (
    vencode NUMBER(4) primary key, 注意:primary key是创建索引组织表所必需的。不允许使用分区。
    venname VARCHAR2(20)
    )
    organization index;
    索引组织表适合于通过主键来访问数据。

    (6)基于函数的索引:如果在WHERE子句的算术表达式或函数中已经包含了某个列,则不会使用该列上的索引。不能在表达式包含任何
    聚合函数,LOB列、REF列或包含LOB或REF的对象类型上创建基于函数的索引。

    示例20:venname是vendor_master表的一个列,用于存储供应商的姓名,假定所有供应商的姓名都以混合大小写的形式存储
    (如:John Smith、Dave Jones、Tony Greig等等),同时假定我们经常需要根据供应商的姓名来查询表的数据。由于
    姓名是以混合大小写的形式存储的,因此可能很难给出姓名的正确大小写形式。
    可以创建如下索引:
    Create INDEX vn_ind ON vendor_master(UPPER(venname));

    示例21:演示如何使用前面创建的基于函数的索引检索数据。
    select * from vendor_master where UPPER(venname)='SMALL';

    要创建基于函数或表达式的索引,必须具有QUERY REWRITE系统权限。

    (7)索引中的分区:与对表进行分区类似,Oracle也允许对索引分区。牵引分区可以存储在不同的表空间中。
    局部分区索引:Oracle为表的每个分区建立一个独立的索引。

    示例22:先创建分区表
    Create table order_mast
    (
    orderno number(4),
    venname varchar2(20)
    )
    partition by range(orderno)
    (
    partition oe1 values less than(1000),
    partition oe2 values less than(2000),
    partition oe3 values less than(maxvalue)
    );

    接着创建局部索引:
    create INDEX myind ON order_mast(orderno) LOCAL;

    全局分区索引:是指在分区表或非分区表上创建的索引。

    示例23:在上面创建的分区表上创建全局索引
    create INDEX glb_ind ON order_mast(orderno) GLOBAL
    partition by range(orderno)
    (
    partition ip1 values less than(1500),
    partition ip2 values less than(maxvalue)
    );

    在有3个分区的表上创建2个分区的索引。注意:不能在散列分区或子分区建立全局索引。

    全局非分区索引:全局分区索引是在分区表上创建的全局索引,它类似于非分区表上的索引,索引的结构不会被分割。

  • 相关阅读:
    基于MPI计算π值
    依赖倒转原则
    里氏代换原则
    开闭原则
    以太坊入门-solidity环境搭建
    【owner】today,last second day
    105-算法应用【N皇后问题】代码实现
    【Java小工具】节点选举Demo
    【加密算法】MD5、SHA算法加密工具类
    50-数据结构【原码、反码和补码】计算机数表示方法
  • 原文地址:https://www.cnblogs.com/brant/p/5637885.html
Copyright © 2020-2023  润新知