索引对Oracle Database优化的探讨
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
索引对Oracle Database优化的探讨
摘要:在系统的应用过程中,数据库性能问题一直是决策者和技术人员共同关注的焦点,影响数据库性能的因素有很多,选择合适的索引能有效地提升查询性能。
在select和where子句的列上创建连接索引,这样查询就只会访问索引,从而优化查询的性能,提升系统响应速度,节约系统资源。
关键词:索引;oracle;优化
中图分类号:tp391 文献标识码:a 文章编号:1009-3044(2013)13-2967-02
在应用系统数据库使用初期,由于数据量比较小,对于包含select、update、delete等语句的各种查询,复杂视图、过程、函数的编写,是体会不出索引在其中起到的重要作用。
但是随着数据库中数据的增加,系统的响应速度就成为目前数据库需要解决的重要问题。
这个时候索引对查询数据的优化作用就体现出来了。
oracle提供了大量索引选项,知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。
一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。
而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟内得以完成,成就感和喜悦感油然而生。
1 基本的索引概念
与书的索引一样,数据库索引能够快速找到表或索引视图中的特定数据信息。
当从表中访问数据的时候,oracle提供了两个选择:
全表扫描,读取表中每一行数据,或者通过rowid一次读取一行数据。
当访问大型表的少量行时,使用索引就能办到。
索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针。
通过创建设计良好的索引以支持查询,可以显著提高数据库查询和应用程序的性能。
索引可以减少为返回查询结果集而必须读取的数据量。
索引还可以强制表中的行具有唯一性,从而确保表数据的完整性。
设计良好的索引可以减少磁盘i/o操作,并且消耗的系统资源也较少,从而可以提高查询性能。
对于sql语句的各种查询,索引会很有用。
oracle中索引的种类繁多,下面就介绍一下索引的类型:
1)b树索引:b树索引是一个通用索引,可以是一个列的简单索引,也可以是多个列的符合索引,在创建索引时它就是默认的索引类型。
2)位图索引:位图索引非常适合于决策支持系统(decision support system,dss)和数据仓库,不应该用于通过事物处理应用程序访问的表。
它可以使用较少到中等基数的列访问非常大的表。
3)hash索引:使用hash索引必须要使用hash集群。
建立一个集群或hash集群的同时,也就定义了一个集群键,所有与这个集群键相关的行都被存储在一个数据库块上,oracle可以通过执行一个hash函数和i/o来访问数据。
通常,hash对于包含有序值的静态数据非常有效。
4)索引组织表:索引组织表会把表的储存结构改成b树结构,以表的主键进行排序。
这种特殊的表和其他类型的表一样,可以在表上执行所有的dml和ddl语句。
由于表的特殊结构,rowid并没有被关联到表的行上。
对于总是通过主键的精确匹配或范围扫描进行访问的表,就需要考虑使用索引组织表。
5)反转键索引:反转键索引储存数据时,被储存的数据值就会与原先储存的数据值相反,结果就是索引会为每次新插入的行更新不同的索引块。
使用反转键索引能够解决在数据载入期间,因某部分索引和磁盘比其他部分使用频繁,索引碰到的与i/o相关的一些瓶颈问题。
6)基于函数的索引:在表中创建基于函数的索引,就允许索引访问支持基于函数的列或数据,在列上执行了函数的查询都能使用这个列的索引。
7)分区索引:分区索引就是简单地把一个索引分成多个片断。
这样可以访问更小的片断,速度也更快,并且还可以把这些片断分别存放在不同的磁盘驱动器上。
分区索引分为两种类型:本地分区索引和全局分区索引。
8)位图连接索引:位图连接索引是基于两个表的链接的位图索引,在数据仓库环境中使用这种索引能够改进连接维度表和事实表的查询性能。
创建位图连接索引后,当用户再一次查询中结合查询事件表和维度表时,就不需要执行连接,因为在位图连接索引中已经有可用的链接结果。
通过压缩位图连接索引中的rowid能够进一
步改进性能,也能够减少访问数据所需的i/o数量。
2 调整查询优化oracle database
v$sqlarea和v$sql是很重要的视图,可以用来查找执行情况最差的sql语句,而v$sessmetric和dba_hist_sqlstats视图则可以选出当前最占资源的会话以及查询。
正确使用索引可以调整这些查询,优化oracle database。
3)成果检验
此次实验通过在三个不同情况下运行同一sql语句所需时间做对比,反应出不同情况下,运行同一sql语句的优劣。
第一次运行sql 语句时,没有创建索引,显然查询耗费了大量的时间运行;第二次运行sql语句时,建立了一个不合适的索引,查询耗费的时间超过了没有创建索引的时候,情况变得更糟了;第三次运行sql语句时,为select和where子句中的列建立了连接索引,查询耗时相当的少,达到了优化查询性能的目的。
通过此次实验不难看出,对于系统中很关键的查询,可以考虑在select和where子句的列上创建连接索引,这样查询就只会访问索引,从而优化查询的性能,提升系统响应速度,节约系统资源。
3 结束语
对于oracle database优化的研究,索引的优化仅仅是一个方面,对select和where子句中的列使用索引,也只是某些情况下优化查询性能的一种方法,只有选择合适的优化方法才能最大限度的提升系统性能,还有更多更加有效地优化方法等待大家的探索和研
究。
参考文献:
[1] 孙风栋.oracle 10g数据库基础教程 [m]. 2版.北京:电子工业出版社, 2012.
[2] (美)尼米克(niemiec,r.j.). oracle database 10g性能调整与优化[m]. 薛莹,译.北京:清华大学出版社,2009.。