一.索引先容
1.1 索引的建坐语法:
CREATE UNIUQE | BITMAP INDEX .
ON .
( | ASC | DESC,
| ASC | DESC,...)
TABLESPACE
STORAGE
LOGGING | NOLOGGING
COMPUTE STATISTICS
NOCOMPRESS | COMPRESS
NOSORT | REVERSE
PARTITION | GLOBAL PARTITION
相干说明
1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
2) | ASC | DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引”
3)TABLESPACE:指定寄存索引的表空间(索引战本表不在一个表空间时效力更高)
4)STORAGE:可进一步设置表空间的存储参数
5)LOGGING | NOLOGGING:是不是对索引发生重做日志(对大表只管运用NOLOGGING往减少占用空间并前进效力)
6)COMPUTE STATISTICS:建坐新索引时汇集统计信息
7)NOCOMPRESS | COMPRESS:是不是运用“键压缩”(运用键压缩可以删除一个键列中呈现的重复值)
8)NOSORT | REVERSE:NOSORT暗示与表中雷同的按次建坐索引,REVERSE暗示相反按次存储索引值
9)PARTITION | NOPARTITION:可以在分区表>战已分区表上对建坐的索引进行分区
1.2 索引特面:
第一,颠末过程建坐唯一性索引,可以包管数据库表中每行数据的唯一性。
第两,可以大大放慢数据的检索速度,这也是建坐索引的最首要的本因。
第三,可以放慢表战表之间的毗连,出格是在实现数据的参考残破性方面出格有心义。
第四,在运用分组战排序子句进行数据检索时,同样可以显著减少查询平分组战排序的时间。
第五,颠末过程运用索引,可以在查询的过程中,运用优化躲藏器,前进系统的性能。
1.3 索引缺少:
第一,建坐索引战维护索引要破耗时间,这类时间随着数据量的增减而增减。
第两,索引需求占物理空间,除数据表占数据空间之外,每个索引借要占一定的物理空间,假如要建坐聚簇索引,那么需求的空间便会更大。
第三,当对表中的数据进行增减、删除战点窜的时分,索引也要动态的维护,这样便降低了数据的维护速度。
1.4 该当建索引列的特面:
1)在常常需求搜索的列上,可以放慢搜索的速度;
2)在做为主键的列上,逼迫该列的唯一性战机关表中数据的摆列结构;
3)在经常常利用在毗连的列上,这些列重如果一些外键,可以放慢毗连的速度;
4)在常常需求按照局限进行搜索的列上建坐索引,由于索引曾排序,其指定的局限是连绝的;
5)在常常需求排序的列上建坐索引,由于索引曾排序,这样查询可以安排索引的排序,放慢排序查询时间;
6)在常常运用在WHERE子句中的列上面建坐索引,放慢前提的判断速度。
1.5 不该当建索引列的特面:
第一,关于那些在查询中很少运用梗概参考的列不该当建坐索引。这是由于,既然这些列很少运用到,因而有索引梗概无索引,其实不能前进查询速度。相反,由于增减了索引,反而降低了系统的维护速度战增大了空间需求。
第两,关于那些只要很少数据值的列也不该当增减索引。这是由于,由于这些列的与值很少,例如人事表的性别列,在查询的后果中,后果集的数据行占了表中数据行的很大比例,即需求在表中搜索的数据行的比例很大。增减索引,其实不能较着放慢检索速度。
第三,关于那些定义为blob数据典范的列不该当增减索引。这是由于,这些列的数据量要么相当大,要么与值很少。
第四,当点窜性能远远大于检索性能时,不该当建坐索引。这是由于,点窜性能战检索性能是相互盾盾的。当增减索引时,会前进检索性能,然则会降低点窜性能。当减少索引时,会前进点窜性能,降低检索性能。因而,当点窜性能远远大于检索性能时,不该当建坐索引。
1.6 限制索引
限制索引是一些没有经历的开收职员常常犯的漏洞之一。在SQL中有良多骗局会使一些索引没法运用。上面联系一些常见的问题:
1.6.1 运用不即是操做符(<>、!=)
上面的查询即便在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。
select cust_Id,cust_name from customers where cust_rating <> "aa";
把上面的语句改成以下的查询语句,这样,在采取基于法例的优化器而不是基于价钱的优化器(更智能)时,将会运用索引。
select cust_Id,cust_name from customers where cust_rating < "aa" or cust_rating > "aa";
出格留意:颠末过程把不即是操做符改成OR前提,便可以运用索引,以禁止全表扫描。
1.6.2 运用IS NULL 或IS NOT NULL
运用IS NULL 或IS NOT NULL同样会限制索引的运用。由于NULL值并没有被定义。在SQL语句中运用NULL会有良多的费事。因而创议开收职员在建表时,把需求索引的列设成 NOT NULL。假如被索引的列在某些行中存在NULL值,便不会运用这个索引(除非索引是一个位图索引,关于位图索引在稍后在具体联系)。
1.6.3 运用函数
假如不运用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列运用函数时,会使优化器疏忽失踪这些索引。 上面的查询不会运用索引(只要它不是基于函数的索引)
select empno,ename,deptno from emp where trunc(hiredate)="01-MAY-81";
把上面的语句改成上面的语句,这样便可以颠末过程索引进行查找。
select empno,ename,deptno from emp where hiredate<(to_date("01-MAY-81")+0.9999);
1.6.4 相比不婚配的数据典范
也是相比易于收现的性能问题之一。 留意上面查询的例子,account_number是一个VARCHAR2典范,在account_number字段上有索引。
上面的语句将执行全表扫描:
select bank_name,address,city,state,zip from banks where account_number = 990354;
Oracle可以自动把where子句变成to_number(account_number)=990354,这样便限制了索引的运用,改成上面的查询便可以运用索引:
select bank_name,address,city,state,zip from banks where account_number ="990354";
出格留意:不婚配的数据典范之间相比会让Oracle自动限制索引的运用,即便对这个查询执行Explain Plan也不能让您收略为甚么做了一次“全表扫描”。
1.7 查询索引
查询DBA_INDEXES视图可得到表中所有索引的列表,留意只能颠末过程USER_INDEXES的方法往检索形式(schema)的索引。拜候USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
1.8 组合索引
当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。在 Oracle9i引进跳跃式扫描的索引拜候方法之前,查询只能在有限前提下运用该索引。好比:表emp有一个组合索引键,该索引包含了empno、 ename战deptno。在Oracle9i之前除非在where之句中对第一列(empno)指定一个值,否则便不能运用这个索引键进行一次局限扫描。
出格留意:在Oracle9i之前,只要在运用到索引的前导索引时才可以运用组合索引!
1.9 ORACLE ROWID
颠末过程每个行的ROWID,索引Oracle供给了拜候单行数据的才力。ROWID其实就是间接指背单独行的线路图。假如想查抄重复值或是其他对ROWID自己的援引,可以在任何表中运用战指定rowid列。
1.10 选择性
运用USER_INDEXES视图,该视图中表示了一个distinct_keys列。相比一下唯一键的数量战表中的行数,便可以判断索引的选择性。选择性越高,索引返回的数据便越少。
1.11 群集因子(Clustering Factor)
Clustering Factor位于USER_INDEXES视图中。该列反响了数据相干于已建索引的列是不是显得有序。假如Clustering Factor列的值接远于索引中的树叶块(leaf block)的数量,表中的数据便越有序。假如它的值接远于表中的行数,则表中的数据便不是很有序。
1.12 两元高度(Binary height)
索引的两元高度对把ROWID返回给用户过程时所要求的I/O量起到关头做用。在对一个索引进行阐发后,可以颠末过程查询DBA_INDEXES的B- level列审查它的两元高度。两元高度首要随着表的大小以及被索引的列中值的局限的狭窄程度而刷新。索引上假若有大量被删除的行,它的两元高度也会增减。更新索引列也近似于删除操做,由于它增减了已删除键的数量。重建索引梗概会降低两元高度。
1.13 快速全局扫描
从Oracle7.3后便可以运用快速全局扫描(Fast Full Scan)这个选项。这个选项承诺Oracle执行一个全局索引扫描操做。快速全局扫描读与B-树索引上所有树叶块。初始化文件中的 DB_FILE_MULTIBLOCK_READ_COUNT参数可以把握同时被读与的块的数量。
1.14 跳跃式扫描
从Oracle9i起头,索引跳跃式扫描特性可以承诺优化器运用组合索引,即便索引的前导列没有出眼前目今现今WHERE子句中。索引跳跃式扫描比全索引扫描要快的多。
上面的相比他们的区别:
SQL> set timing on
SQL> create index TT_index on TT(teamid,areacode);
索引已建坐。
已用时间: 00: 02: 03.93
SQL> select count(areacode) from tt;
COUNT(AREACODE)
---------------
7230369
已用时间: 00: 00: 08.31
SQL> select count(areacode) from tt;
COUNT(AREACODE)
---------------
7230369
已用时间: 00: 00: 07.37
1.15 索引的典范
B-树索引 位图索引 HASH索引 索引编排表
反转键索引 基于函数的索引 分区索引 当天战全局索引
两. 索引分类
Oracle提
供了大量索引选项。知讲在给定前提下运用哪个选项关于一个运用步伐的性能往说极端紧张。一个漏洞的选择梗概会激起死锁,并致使数据库性能慢剧下落或过程终
止。而假如做出正确的选择,则可以公道运用资本,使那些曾运转了几个小时甚至几天的过程在几分钟得以完成,这样会使您坐刻成为一名英雄。上面便将简单的联系每个索引选项。
上面联系的索引典范:
B树索引(默认典范)
位图索引
HASH索引
索引机关表索引
反转键(reverse key)索引
基于函数的索引
分区索引(当天战全局索引)
位图毗连索引
2.1 B树索引 (默认典范)
B树索引在Oracle中是一个通用索引。在建坐索引时它就是默认的索引典范。B树索引可所以一个列的(简单)索引,也可所以组合/复合(多个列)的索引。B树索引最多可以包含32列。
在下图的例子中,B树索引位于雇员表的last_name列上。这个索引的两元高度为3;接下往,Oracle会脱过两个树枝块(branch block),到达包含有ROWID的树叶块。在每个树枝块中,树枝行包含链中下一个块的ID号。
树叶块包含了索引值、ROWID,以及指背前一个战后一个树叶块的指针。Oracle可以从两个标的方针遍历这个两叉树。B树索引保存了在索引列上有值的每个数据行的ROWID值。Oracle不会对索引列上包含NULL值的行进行索引。假如索引是多个列的组合索引,而个中列上包含NULL值,这一行便会处于包含NULL值的索引列中,且将被处理为空(视为NULL)。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23673798/viewspace-1116394/
,如需转载,请注明出处,否则将追究法律责任。