博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle 对象管理 03_索引
阅读量:6803 次
发布时间:2019-06-26

本文共 4507 字,大约阅读时间需要 15 分钟。

hot3.png

1、索引的创建

CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>        --默认为Btree索引
    ON <schema>.<table_name> 
        (<column_name> | <expression> ASC | DESC,         --expression基于函数的索引
         <column_name> | <expression> ASC | DESC,...)     --组合索引
    TABLESPACE <tablespace_name>                          --索引存储的表空间
    STORAGE <storage_settings>                            --设置表空间存储参数
    LOGGING | NOLOGGING                                   --指定是否产生重做日志
    COMPUTE STATISTICS                                    --创建时收集统计信息
    NOCOMPRESS | COMPRESS<nn>                             --键压缩,删掉键中重复的值
    NOSORT | REVERSE                                      --索引顺序与表相同,相反
    PARTITION | GLOBAL PARTITION<partition_setting>       --索引分区

2、索引特性

索引的好处
    加快数据的检索速度,加速表和表之间的连接,减少查询中分组和排序的时间,提高系统的性能。
索引的不足
    创建索引和维护索引要耗费时间,需要占物理空间,对表中数据的DML操作,索引也需要动态维护,降低数据维护速度。
应该建索引的列
    经常需要搜索的列
    经常用在连接的列
    经常需要排序的列
    经常使用在WHERE 子句中的列
    组合索引列中把最频繁访问的列放最前    
当修改性能远大于检索性能时,不要创建索引
    e.组合索引时尽量将过滤大范围的放在后面,因为SQL执行是从后往前的,
限制索引,使一些索引无法使用
    使用不等于操作符(<> 、 != ),通过把不等于操作符改成 OR 条件,在RBO下会使用索引,CBO下仍不会使用索引。
    使用 IS NULL  或 IS NOT NULL ,要建索引的列尽量不要有空值;
    使用函数,对索引列用函数会限制索引,可以将函数用在列的取值上;
    比较不匹配的数据类型,比较时会将列转成与值相同的数据类型再比较,可以转换值得数据类型;
索引的选择性(USER_INDEXES.distinct_keys/count(*)),判断索引返回数据的多少;
群集因子(USER_INDEXES.Clustering_Factor,与leaf_blocks,num_rows)进行比较,判断索引列的有序性
二元高度(Binary height),user_INDEXES.Blevel列,二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程
   度而变化,对索引列的删除修改会增加二元高度,重建索引可能会降低二元高度。
快速全局扫描,(Fast Full Scan) 允许 Oracle 执行一个全局索引扫描操作。快速全局扫描读取 B- 树索引上所有树叶块。
跳跃式扫描:允许优化器使用组合索引,即索引的前导列没有出现在 WHERE 子句中。比全索引扫描要快的多。可以对组合
            索引的部分列使用。

3、索引管理

重建索引
    alter index index_name rebuild tablespace index02;
    alter index index_name  rebuild  online;
    对于分区索引,不能整体进行重建,只能对单个分区进行重建。语法如下:
    Alter index idx_name rebuild partition index_partition_name [online nologging]
    删除索引,删除的数据在索引里只是标记为删除,只有删除的数据大于块里存的总记录,这时一个块被清空,索引
    重建全局索引命令如下:
    Alter index idx_name rebuild [online nologging]
总的数据条数才会减少。
    drop  index  index_name;
整理索引碎片
    alter index index_name  coalesce;
分析索引
    analyze index index_name validate structure;
    select height,name,lf_rows,lf_blks,del_lf_rows from index_stats;

4、索引查询视图

    DBA_INDEXES
    USER_INDEXES
    USER_IND_COLUMNS 
    
5、ORACLE ROWID 
    ROWID 其实就是直接指向单独行的线路图,提供了访问单行数据的能力。6/3/6/3:对象/文件/块/行
    查询表里行的rowid,块号
        select rowid,dbms_rowid.rowid_block_number(rowid), iid from tb;
    工具函数,查询行所在的文件号,块号,行号
        --工具函数
        create or replace function get_rowid
        (l_rowid in varchar2)
        return varchar2
        is
        ls_my_rowid  varchar2(200);          
        rowid_type  number;          
        object_number  number;          
        relative_fno  number;          
        block_number  number;          
        row_number  number;  
        begin
         dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);          
         ls_my_rowid := 'Object# is      :'||to_char(object_number)||chr(10)||
          'Relative_fno is :'||to_char(relative_fno)||chr(10)||
          'Block number is :'||to_char(block_number)||chr(10)||
          'Row number is   :'||to_char(row_number);
         return ls_my_rowid ;
        end;   
        select get_rowid('AAASheAAEAAAAIOAAB') from dual;
        
6、索引的分类
B树索引
    通用索引、默认的索引类型,最多可以包括 32 列。索引列的值都存储在索引中。当索引列的值满足
查询时就不用从表中查询;B 树索引的索引值中包含 ROWID ,这样 Oracle 就可以在行级别上锁定索引。
Oracle不会对索引列上包含 NULL 值的行进行索引。树叶块包含了索引值、ROWID,以及指向前一个和后
一个树叶块的指针。
    特点:
        适合与大量的增、删、改(OLTP )
        不能用包含OR 操作符的查询,CBO优化器OR操作不走索引
        适合高基数的列(唯一值多) 
位图索引
    非常适合于决策支持系统(Decision Support System , DSS) 和数据仓库,位图索引存储为压缩的索
引值,其中包含了一定范围的 ROWID ,因此 Oracle 必须针对一个给定值锁定所有范围内的 ROWID 。这
种锁定类型可能在某些 DML 语句中造成死锁。列中包含了非常多的重复值,很少UPDATE操作,最多30列
    特点:
        适合与决策支持系统;
        做UPDATE 代价非常高;
        非常适合OR 操作符的查询;
        基数比较少的时候才能建位图索引; 
HASH索引 
    使用HASH索引必须要使用HASH集群。
索引组织表
    把表的存储结构改成B树结构,以表的主键进行排序。
反转键索引 
    磁盘容量有限,同时还要执行大量的有序载入,就可以使用反转键索引
基于函数的索引 
    create index EMP$UPPER_JOB on   emp(UPPER(job)); 
分区索引 
    就是简单地把一个索引分成多个片断。可以访问更小的片断( 也更快 ) ,B树和位图索引都可以被
分区,而HASH索引不可以被分区。表被分区而索引未被分区;表未被分区而索引被分区;表和索引都被
分区。分区能够提供更多可以提高性能和可维护性的可能性,用分区后的表和索引时,Oracle还支持并
行查询和并行DML。
本地分区索引
    使用与表相同的分区键和范围界限来对本地索引分区。本地索引可以是B树或位图索引,当表的分
区发生变化时,索引的维护由Oracle自动进行。局部索引只支持分区内的唯一性,无法支持表上的唯一
性,因此如果要用局部索引去给表做唯一性约束,则约束中必须要包括分区键列。
    create index ix_custaddr_local_id on custaddr(id) local;
    有前缀索引:指包含了分区键,并且将其作为引导列的索引。
    无前缀索引:索引的列不是以分区键开头,或者不包含分区键列。
全局分区索引
    可以选择是否分区,而且索引的分区可以不与表分区相对应。全局分区索引只能是B树索引,到目
前为止(10gR2),oracle只支持有前缀的全局索引。oracle不会自动的维护全局分区索引,当我们在对
表的分区做修改时可以加上update global indexes,或者执行完操作后 REBUILD。oracle只支持
range partitioned 和 Hash Partitioned.2中类型的全局分区索引
全局索引,全局索引对所有分区类型都支持:全局分区索引,只支持Range 分区和Hash 分区:
   表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和
索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引。
            
参考资料:
http://www.2cto.com/database/201110/107271.html
http://www.cnblogs.com/flowerszhong/p/4535206.html

什么是聚集索引,什么是非聚集索引,什么又是主键?

    聚集索引确定表中数据的物理顺序。聚集索引规定数据在表中的物理存储顺序,一个表只能包含一个聚集
索引,但该索引可以包含多个列。聚集索引对于搜索范围值的列特别有效。从表中检索的数据进行排序时可以
将该表在该列上创建聚集索引,提高性能。 
    非聚集索引是,索引与数据物理存储分开,索引带有指针指向数据的存储位置。索引和表按自己的值排序
多用于包含大量非重复值的列,返回精确匹配的查询。
    PRIMARY KEY 约束表中一个列或列的组合,其值能唯一地标识表中的每一行。通过它可强制表的实体完整性。
http://blog.sina.com.cn/s/blog_7e662b4a01012cx6.html    

转载于:https://my.oschina.net/peakfang/blog/2245329

你可能感兴趣的文章
20145129 《Java程序设计》第5周学习总结
查看>>
Linux服务器---使用mysql
查看>>
Linux服务器---安装telnet
查看>>
UBUNTU 12.04 LTS 64 JDK 安装配置
查看>>
CIF、DCIF、D1分辨率是多少?
查看>>
js 中解决 下载路径有中文的问题
查看>>
Sublime Text 全程指引 by Lucida
查看>>
php 面向对象基础总结
查看>>
负载均衡集群解决方案 (二)Nginx
查看>>
linux下tc控制流量控制档
查看>>
Oracle基础学习总结之数据库与实例
查看>>
sftp配置多用户权限
查看>>
System Volume Information 文件夹文件删除
查看>>
我的友情链接
查看>>
Linux初认识
查看>>
netbeans build in one jar
查看>>
CentOS 6.6 新安装系统的网络IP配置
查看>>
zabbix邮件报警设置
查看>>
win10远程桌面连接错误
查看>>
RH134 UNIT5
查看>>