分享
 
 
 

Oracle数据库经典优化之索引原理篇

王朝oracle·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。而假如做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您马上成为一位英雄。这篇文章就将简单的讨论每个索引选项。主要有以下内容:

1、基本的索引概念:

查询DBA_INDEXES视图可得到表中所有索引的列表,注重只能通过USER_INDEXES的方法来检索模式(schema)的索引。访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。

2、组合索引:

当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。在 Oracle9i引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。比如:表emp有一个组合索引键,该索引包含了empno、ename和deptno。在Oracle9i之前除非在where之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。

非凡注重:在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引!

3、Oracle ROWID:

通过每个行的ROWID,索引Oracle提供了访问单行数据的能力。ROWID其实就是直接指向单独行的线路图。假如想检查重复值或是其他对ROWID本身的引用,可以在任何表中使用和指定rowid列。

4、限制索引:

限制索引是一些没有经验的开发人员经常犯的错误之一。在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题:

4.1 使用不等于操作符(<>、!=):

下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。

select cust_Id,cust_name

from customers

wherecust_rating <> 'aa';

把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。

select cust_Id,cust_name

from customers

wherecust_rating < 'aa' or cust_rating > 'aa';

非凡注重:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。

4.2 使用IS NULL 或IS NOT NULL:

使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开 发人员在建表时,把需要索引的列设成NOT NULL。假如被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引,关于位图索引在稍后在具体讨论)。

4.3 使用函数:

假如不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。

下面的查询不会使用索引(只要它不是基于函数的索引):

select empno,ename,deptno

from emp

wheretrunc(hiredate)='01-MAY-81';

把上面的语句改成下面的语句,这样就可以通过索引进行查找。

select empno,ename,deptno

from emp

wherehiredate<(to_date('01-MAY-81')+0.9999);

4.4 比较不匹配的数据类型:

比较不匹配的数据类型也是比较难于发现的性能问题之一。

注重下面查询的例子,account_number是一个VARCHAR2类型,在account_number字段上有索引。下面的语句将执行全表扫描。

select bank_name,address,city,state,zip

from banks

whereaccount_number = 990354;

Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引:

select bank_name,address,city,state,zip

from banks

whereaccount_number ='990354';

非凡注重:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行EXPlain Plan也不能让您明白为什么做了一次“全表扫描”。

5、选择性:

使用USER_INDEXES视图,该视图中显示了一个distinct_keys列。比较一下唯一键的数量和表中的行数,就可以判定索引的选择性。选择性越高,索引返回的数据就越少。

6、群集因子(Clustering Factor):

Clustering Factor位于USER_INDEXES视图中。该列反映了数据相对于已索引的列是否显得有序。假如Clustering Factor列的值接近于索引中的树叶块(leaf block)的数目,表中的数据就越有序。假如它的值接近于表中的行数,则表中的数据就不是很有序。

7、二元高度(Binary height):

索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到要害作用。在对一个索引进行分析后,可以通过查询DBA_INDEXES的B-level列查看它的二元高度。二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化。索引上假如有大量被删除的行,它的二元高度也会增加。更新索引列也类似于删除操作,因为它增加了已删除键的数目。重建索引可能会降低二元高度。

8、快速全局扫描:

在Oracle7.3后就可以使用快速全局扫描(Fast Full Scan)这个选项。这个选项答应Oracle执行一个全局索引扫描操作。快速全局扫描读取B-树索引上所有树叶块。初始化文件中的DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目。

9、跳跃式扫描:

从Oracle9i开始,索引跳跃式扫描特性可以答应优化器使用组合索引,即便索引的前导列没有出现在WHERE子句中。索引跳跃式扫描比全索引扫描要快的多。下面的程序清单显示出性能的差别:

create index skip1 on emp5(job,empno);

index created.

select count(*)

from emp5

where empno=7900;

Elapsed:00:00:03.13

Execution Plan

0 SELECT STATEMENT Optimizer

=CHOOSE(Cost=4 Card=1 Bytes=5)

10SORT(AGGREGATE)

21INDEX(FAST FULL SCAN)

OF 'SKIP1'(NON-UNIQUE)

Statistics

6826 consistent gets

6819 physical reads

select /*+ index(emp5 skip1)*/ count(*)

from emp5

where empno=7900;

Elapsed:00:00:00.56

Execution Plan

0 SELECT STATEMENT Optimizer

=CHOOSE(Cost=6 Card=1 Bytes=5)

10SORT(AGGREGATE)

21INDEX(SKIP SCAN) OF

'SKIP1'(NON-UNIQUE)

Statistics

21 consistent gets

17 physical reads

10、索引的类型:

B-树索引 位图索引 HASH索引 索引编排表

反转键索引 基于函数的索引 分区索引 本地和全局索引

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有