zoukankan      html  css  js  c++  java
  • oracle 第18章 索引

    2015-10-23

    目录

    1.创建索引 CREATE INDEX

    2.修改索引 ALTER INDEX

    3.删除索引 DROP INDEX

    1.创建索引 CREATE INDEX

    【语法】CREATE INDEX 官方文档

    create_index::=

    CREATE [ UNIQUE | BITMAP ] INDEX [ schema. ] index
      ON { cluster_index_clause
         | table_index_clause
         | bitmap_join_index_clause
         }
    [ USABLE | UNUSABLE ] ;
    View Code

    cluster_index_clause ::=

    CLUSTER [ schema. ] cluster index_attributes
    View Code

    table_index_clause ::=

    [ schema. ] table [ t_alias ]
    (index_expr [ ASC | DESC ]
      [, index_expr [ ASC | DESC ] ]...)
      [ index_properties ]
    View Code

    bitmap_join_index_clause ::=

    [ schema.]table
       ( [ [ schema. ]table. | t_alias. ]column
         [ ASC | DESC  ]
           [, [ [ schema. ]table. | t_alias. ]column
              [ ASC | DESC ]
           ]...
       )
       FROM [ schema. ]table [ t_alias ]
              [, [ schema. ]table [ t_alias ]
            ]...
       WHERE condition
          [ local_partitioned_index ] index_attributes
    View Code

    2.修改索引 ALTER INDEX

    【语法】 ALTER INDEX 官方文档

    3.删除索引 DROP INDEX

    【语法】 DROP INDEX 官方文档

    【例子】

    索引是oracle的一个对象,是否使用索引由oracle的CBO优化器决定。
    
    一、数据访问方式
    1.全表扫描(full table scan)
    如果读取表的数据总量超过5%~10%,通常会进行全表扫描,全表扫描采取多块读。
    SQL> explain plan for select * from dual;
    SQL> select * from table(dbms_xplan.display);
    
    2.行id扫描(rowid)
    在向表中插入数据时,隐含会创建改行的rowid,rowid是数据行所存储的数据块地址。rowid查找数据采取单块读。
    SQL> expalin plan for select * from dept where rowid = 'AAAAyGAADAAAA..';
    SQL> select * from table(dbms_xplan.display);
    
    3.索引扫描(index rowid)
    索引扫描是通过索引找到数据行的rowid,然后通过rowid直接到表中查找数据。因为一个rowid对应一个数据行,所以这种方式也会采取单块读。
    SQL> expalin plan for select * from emp;
    SQL> select * from table(dbms_xplan.display);
    
    二、索引扫描类型
    1.索引唯一扫描(index unique scan)
    索引唯一扫描是通过唯一键、主键,返回一个数据行。
    SQL> explain plan for select * from emp where empno=10;
    SQL> select * from table(dbms_xplan.dispaly);
    
    2.索引范围扫描(index range scan)
    在唯一键上使用range操作符(><<>>=<=between),在组合索引上只使用部分列查询出多行;对非唯一索引列查询。
    SQL> explain plan for select * from emp where empno>18;
    SQL> select * from table(dbms_xplan.display);
    
    3.索引全扫描(index full scan)
    查询出的数据全部从索引得到。
    SQL> explain plan for select empno,ename from emp;
    SQL> select * from table(dbms_xplan.display);
    
    4.索引快速扫描(index fast full scan)
    扫描所有数据块,不进行数据排序,可以多块读、并行读。
    SQL> explain paln for select empno,ename from big.emp;
    
    三、索引限制条件
    1.不等运算
    SQL> explain plan for select * from emp where empno<>10;
    SQL> select * from table(dbms_xplan.display);
    
    2.NULL或IS NOT NULL
    SQL> select column_name from user_ind_columns where table_name='EMP';
    SQL> create index idx_sal_emp on emp(sal);
    SQL> select column_name from user_ind_columns where table_name='EMP';
    SQL> explain plan for select empno,ename,deptno from emp where sal is null;
    SQL> select * from table(dbms_xplan.display);
    
    3.函数trunc、substr、to_date、to_char、instr等
    SQL> explain plan for select empno,ename,deptno from emp where trunc(hiredate)='03-12月-81';
    SQL> select * from table(dbms_xplan.display);
    
    #修改SQL防止函数对索引的影响
    SQL> explain plan for select empno,enmae,deptno from emp where hiredate>'03-12月-81' and hiredate < to_date('03-12月-81')+0.999999);
    
    3.比较不匹配数据类型
    SQL> explain plan for select bank_name,address,city,state,zip from banks where zip=100043;
    SQL> select * from table(dbms_xplan.display);
    
    选择性:选择性高指不同的值越多,使用索引返回的数据量越少。
    集群因子:集群因子是通过一个索引扫描一张表,需要访问表的数据块数量。
    
    #查询索引的二元高度
    SQL> select blevel,index_name from user_indexes where index_name='EMP_DEPARTMENT_IX';
    
    #收集表employees包含直方图的统计信息
    SQL> exec dbms_stats.gather_table_stats('HR','EMPLOYEES',METHOD_OPT=>'FOR COLUMNS SIZE 10 job_id');
    
    #对emp表建立索引
    SQL> conn scott/oracle;
    SQL> create index emp_ename_idx on emp(ename);
    #查询索引信息
    SQL> col index_name for a20;
    SQL> col index_type for a10;
    SQL> col table_name for a20;
    SQL> col tablespace_name for a20;
    SQL> select index_name,index_type,table_name,tablespace_name from user_indexes;
    #查询索引对应的表空间信息
    SQL> select a.index_name,a.tablespace_name,b.file_name from dba_indexes a,dba_data_files b where a.index_name like 'EMP%' and a.tablespace_name = b.tablespace_name;
    
    #创建索引表空间
    SQL> conn system/oracle;
    SQL> create tablespace index_tbs datafile '/u01/app/oracle/oradata/orcl/index_tbs1.dbf' size 100M autoextend on;
    #创建表多列索引
    SQL> create index emp_ename_sal_idx on emp(ename,sal) tablespace index_tbs;
    #查看多列索引emp_ename_sal_idx信息
    SQL> col index_name for a20;
    SQL> run select index_name,table_name,tablespace_name from user_indexes where index_name like 'EMP%';
    
    #查询索引列信息
    SQL> col column_name for a40;
    SQL> select index_name,table_name,column_name from user_ind_columns where index_name like 'EMP%';
    #查询索引信息
    SQL> col dropped for a10;
    SQL> rum select index_name,table_name,table_owner,dropped,tablespace_name from user_indexes;
    
    #创建位图索引,适合数据仓库
    SQL> create bitmap index emp_job_bitmap_idx on emp(job);
    #查看位图索引
    SQL> col index_name for a20;
    SQL> col index_type for a20;
    SQL> col table_name for a10;
    SQL> select index_name,index_type,table_name,status from user_indexes where index_name like 'EMP%';
    
    #创建cluster表,hash索引适合数据仓库
    SQL> create cluster credit_cluster(card_no varchar2(16),transdate date sort) hashkeys 10000 hash is ora_hash(card_no) size 2186;
    SQL> create table credit_orders(card_no varchar2(16),transdate date,amount number) cluster credit_cluster(card_no,transdate);
    
    #创建反向键索引
    SQL> create index emp_sal_reverse_idx on emp(sal) reverse;
    #查看反向键索引
    SQL> select index_name,index_type,table_name from user_indexes where index_name like 'EMP%';
    
    #创建基于upper函数的函数索引
    SQL> create index dept_dname_idx on dept(upper(dname));
    SQL> select upper(dname) from dept where upper(dname) = 'NEW YORK';
    #通过user_indexes查看函数索引信息
    SQL> col index_type for a30;
    SQL> select idnex_name,index_type,table_name from user_indexes where index_name like 'DEPT%';
    #通过user_idx_columns查看函数索引信息
    SQL> select index_name,table_name,column_name from user_ind_columns;
    
    
    #监控索引emp_ename_bitmapt_idx
    SQL> alter index emp_ename_bitmap_idx monitoring usage;
    SQL> select empno,ename,sal from emp where ename like 'S%';
    SQL> alter index emp_ename_bitmap_idx nomonitoring usage;
    SQL> select index_name,table_name,monitoring,used from v$object_usage;
    SQL> select index_name,start_monitoring,end_monitoring from v$object_usage where index_name = 'EMP_ENAME_BITMAP_IDX';
    
    #重建索引
    SQL> alter index emp_ename_bitmap_idx rebuild;
    #重建索引并迁移表空间
    SQL> alter index dept_dname_idx rebuild tablespace index_tbs1;
    SQL> select index_name,table_name,tablespace_name,status from user_indexes;
    #重建索引并修改存储参数
    SQL> alter index emp_ename_bitmap_idx rebuild pctfree 30 storage (next 100k);
    #联机重建索引
    SQL> alter index dept_dname_idx rebuild online;
    
    #查询当前索引参数设置
    SQL> col index_name for a20;
    SQL> select index_name,pct_free,pct_increase,initial_extent,next_extent from user_indexes;
    #通过rebuild修改索引参数
    SQL> alter index emp_job_bitmap_idx rebuild pctfree 30 storage (next 100k);
    #查看修改后索引参数
    SQL> select index_name,pct_free,pct_increase,initial_extent,next_extent from user_indexes where index_name = 'emp_job_bitmap_idx';
    #增加索引磁盘空间
    SQL> alter index emp_job_bitmap_idx allocate extent;
    #查询索引区段信息
    SQL> select segment_name,segment_type,tablespace_name,extents from user_segment where segment_type = 'INDEX' and segment_name like 'EMP%';
    #合并索引碎片
    SQL> alter index emp_job_bitmap_idx coalesce;
    
    #删除索引
    SQL> drop index dept_dname_idx;

    参考资料

    [1] 林树泽.Oracle 11g R2 DBA操作指南[M].北京:清华大学出版社,2013

    [2] Oracle中的索引详解

    [3] oracle索引,索引的建立、修改、删除

    [4] ORACLE索引介绍和使用

    [5] Oracle 索引 详解

    [6] oracle 索引

    [7] Oracle 索引的分类,分析与比较....(转载)

    [8] Oracle索引 详解

    [9] Oracle 索引基本原理

    [10] 浅谈Oracle索引

    [11] oracle-索引原理

    [12] oracle 的索引

    [13] Oracle索引整理的详细描述

    [14] oracle索引类型

    [15] Oracle索引类型-参考

    [16] Oracle 索引的分类

    [17] [Oracle]深入研究B-树索引

    [18] B树索引学习总结

    [19] B树索引和位图索引

    [20] Oracle B树索引概念的理解

    [21] Oracle B树索引分析(B-Tree Index)

    [22] 深入研究B树索引(一)

    [23] ORACLE中的位图索引详解

    [24] oracle位图索引

    [25] Oracle 索引(位图索引)

    [26] Oracle - 怎样使用B树索引和位图索引

    [27] Oracle索引(B*tree与Bitmap)的学习总结

    [28] Oracle基本索引的使用

    [29] oracle 反向键索引的原理和用途(减少索引热点块)!

    [30] Oracle中的反向索引

    [31] oracle函数索引小结

    [32] 深入探讨Oracle函数索引

    [33] Oracle 实现基于函数的索引

    [34] Oracle监控索引使用

    [35] Oracle索引监控(monitor index)

    [36] Oracle 索引监控与外键索引

    [37] ORACLE重建索引详解

    [38] oracle 重建索引方法 分析

    [39] oracle重建索引

    [40] Oracle 表的移动和索引的重建

    [41] Oracle表与索引的分析及索引重建

    [42] Oracle性能分析9:重建索引

    [43] Oracle维护索引

    [44] ORACLE索引的日常维护

    [45] Oracle 索引的维护

    [46] Oracle的分区表和Local索引创建与维护

    [47] 从实例看oracle的索引监控与无效索引维护

  • 相关阅读:
    Android入门:Button
    Android入门:部署时的常见错误
    to be
    Android入门:单元测试
    忘记 MySQL 的 root 帐号密码该怎么办
    Eclipse开发build path中jar包部署到应用中
    报告两个bug
    本站导引
    一个用Word做报表设计的报表系统windwardreports
    智能互联网
  • 原文地址:https://www.cnblogs.com/cenliang/p/4905373.html
Copyright © 2011-2022 走看看