`
wenhai_zhang
  • 浏览: 185799 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

重温Oracle(5)

 
阅读更多

 

第十六章 Index 索引

 

索引

Select * from user_indexes;  --查询当前登录用户的现有索引

Select * from user_ind_columns; --查询索引的详细信息,有索引建立在哪些字段上等。

 

什么是索引(Index)

一种用于提升查询效率的数据库对象;

通过快速定位数据的方法,减少磁盘I/O操作;

索引信息与表独立存放;

Oracle数据库自动使用和维护索引。

 

索引的分类

唯一性索引

非唯一性索引

 

创建索引的两种方式

自动创建 - 在定义主键或唯一键约束时系统会自动在相应的字段上创建唯一性索引

手动创建 - 用户可以再其他列上创建非唯一性索引,以加速查询。

 

索引的优缺点

优点:

大大加快数据的检索速度;

创建唯一性索引,保证数据库表中每一行数据的唯一性;

加速表和表之间的连接;

在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点:

索引需要占用物理空间;

当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

 

创建索引的原则

创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。

--select操作占大部分的表上创建索引;

--where子句中出现最频繁的列上创建索引;

--在选择性高的列上创建索引(补充索引选择性,最高位1eg:primary key)

--复合索引的主列应该是最有选择性的和where限定条件最常用到的列,以此类推第二列

--小于5M的表,最好不要使用索引来查询,表越小,越适合全表扫描。

 

使用索引的原则

--查询结果是所有数据行的5%以下时,使用index查询效果最好;

--where条件中经常用到表的多列时,使用复合索引效果会好于几个单列索引,因为当sql语句所查询的列,全部都出现在复合索引中时,此时由于Oracle只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多;

--索引利于Select,但对经常insertdelete,尤其是update的表,会降低效率。

Eg:试比较下面两条SQL语句(emp表的deptno列上建有ununique index:

语句Aselect dname,deptno from dept where deptno not in (select deptno from emp);

语句Bselect dname,deptno from dept where deptno not exists (select deptno from emp where dept.deptno = emp.deptno);

这两条查询语句实现的结果都是相同的,但是执行语句A的时候,Oracle会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引,执行语句B的时候,由于在子查询中使用了联合查询,Oracle只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的效率高。

--where子句中的这个字段,必须是复合索引的第一个字段;

Eg:一个索引是按f1,f2,f3的次序简历的,若where子句是f2=:var2,则因为f2不是索引的第1个字段,无法使用该索引。

--where子句中的这个字段,不应该参与任何形式的计算:任何对列的操作都将导致表扫描,它包括数据库函数,计算表达式等等,查询时要尽可能将操作移至等号右边。

--应尽量数据各种操作符对Oracle是否使用索引的影响:一下这些操作会显式(explicitly,明确的)地阻止Oracle使用索引:is null; is not null; not in ; !=; like; numeric_col+0; date_col+0; char_col||’ ‘; to_char; to_number; to_date等。

 

Eg:select jobid from mytabs where isReq=’0’ and to_date(updatedate) >= to_Date(‘2012-11-27’,’YYYY-MM-DD’); --updatedate列的索引不会生效。

创建索引

Create index idxName on tblName(cols…); --tblName上以cols(可多列)创建idxName索引。

 

索引的存储

索引和表都是独立村爱的。在为索引指定表空间的时候,不要将索引的表和索引指向同一个表空间,这样可以避免产生IO冲突。使Oracle能够并行访问存放在不同硬盘中的索引数据和表数据,更好的提高查询速度。

 

删除索引

Drop index pk_dept1;

 

索引类型

B数索引(B Tree Index

创建索引的默认类型,结构是一棵树,采用的是平衡B树算法:

右子树节点的键值大于等于父节点的键值;

坐子树节点的键值小于等于父节点的键值。

 

位图索引(BitMap Index)

如果表中的某些字段取值范围比较小,比如职员性别、分数列ABC级。只有2个值。这样的字段如果建立B树索引没有意义,不能提高检索速度。这时我们推荐用位图索引。

Create BitMap Index pk_sex on student(sex);

 

管理索引

<!--[if !supportLists]-->1,  <!--[endif]-->先插入数据后创建索引;

向表中插入大量数据之前最好不要先创建索引,因为如果先创建索引,那么在插入每行数据的时候都要更改索引,这样会大大降低插入数据的速度。

<!--[if !supportLists]-->2,  <!--[endif]-->设置合理的索引列顺序;

<!--[if !supportLists]-->3,  <!--[endif]-->限制每个表索引的数量;

<!--[if !supportLists]-->4,  <!--[endif]-->删除不必要的索引;

<!--[if !supportLists]-->5,  <!--[endif]-->为每个索引指定表空间;

<!--[if !supportLists]-->6,  <!--[endif]-->经常做insertdelete尤其是update的表最好定期exp/imp表数据,整理数据,降低碎片(缺点:要停应用,以保持数据一致性,不实用);有索引的最好定期rebuild索引(rebuild期间只允许表的select操作,可在数据库较空闲时间提交),以降低索引碎片,提高效率。

 

索引问题

<!--[if !supportLists]-->1,  <!--[endif]-->针对一个表的查询语句能否会用到两个索引?

<!--[if !supportLists]-->2,  <!--[endif]-->如果能用到,那么其实现原理是怎样的?

<!--[if !supportLists]-->3,  <!--[endif]-->效率如何?其代价如何,比如额外开销等。

 

1,  一个表的查询语句可以同时用到两个索引(原书有附结果图)。

<!--[if !supportLists]-->2,  <!--[endif]-->索引时可以独立于表存在的一种数据库对象,它是对基表的一种排序(默认是B树索引,就是二叉树的排序方式),比如:t(x,y,z),在X,Y,Z上分别建立了索引(idx1,idx2,idx3),那在查询select * from t where x=1 and y=2;的时候,会分别用到idx1,idx2

原理:先到idx1索引表中查询符合x=1条件的记录,然后到idx2索引表中查询符合y=2条件的记录。

<!--[if !supportLists]-->3,  <!--[endif]-->这样的查询效率,肯定是大于没有索引情况下的全表扫描(table access full),但是有两个问题:

问题一:建立索引将占用额外的数据库空间,更重要的是增删改操作的时候,索引的排序也必须改变,加大了维护的成本;

问题二:如果经常查询x=?y=?,那推荐使用组合index(x,y),这样情况下组合所以你的效率也远高于两个单独的索引。

 

同时在用组合索引的时候,一定要注意一个细节:建立组合索引index(x,y,z)的时候,那在查询条件中出现x,xy,xyz,yzx都是可以用到该组合索引,但是y,yz,z是不能涌动啊该索引的。关于这段话的原文如下:

A leading portion of an index is a set of one or more columns that were specified first and consecutively in the list of columns in the CREATE INDEX statement that created the index. Consider this CREATE INDEX statement:

CREATE INDEX comp_ind ON table1(x,y,z);

x,xy,and xyz combinations of columns are leading portions of the index

yz,y,and z combinations of columns are not leading portions of the index

 

 

 张文海

 

分享到:
评论

相关推荐

    数据库Oracle教程

    本教程旨在帮助你重温或深入学习Oracle数据库的基础知识及高级特性,让你在数据库管理领域更加得心应手。 首先,Oracle数据库的核心概念包括数据模型、SQL语言、数据库架构和事务管理。数据模型是数据库设计的基础...

    oracle基础知识回顾与练习.zip

    总的来说,“oracle基础知识回顾与练习.zip”提供了全面的Oracle SQL学习路径,无论你是初学者还是希望重温基础的开发者,都能从中受益。通过系统学习和实践,你可以逐步掌握Oracle数据库的关键技能,为未来的职业...

    zkoss CE6.0+spring3.0.5+hibernate3.6+oracle10g+mysql5最全包

    这是一个关于企业级应用开发的集成环境包,包含了前端框架ZKoss CE6.0、后端框架Spring3.0.5、ORM框架Hibernate3.6,以及两种数据库Oracle10g和MySQL5。这个组合是早期Java开发中的常见配置,对于理解当时的软件架构...

    行业-89 再次重温写出各种SQL语句的时候,会用什么执行计划?(2).rar

    DBMS还提供了查询分析工具,如Oracle的Explain Plan或SQL Server的Execution Plan,它们能展示每一步的预计成本、实际资源消耗和操作顺序,帮助开发者理解并优化执行计划。 总结来说,"行业-89 再次重温写出各种SQL...

    行业-88 再次重温写出各种SQL语句的时候,会用什么执行计划?(1).rar

    本资料“行业-88 再次重温写出各种SQL语句的时候,会用什么执行计划?(1)”很可能是探讨SQL查询执行计划的一份深入教程,旨在帮助读者掌握如何分析和优化SQL语句的执行流程。 首先,执行计划包括以下几个关键元素...

    行业-90 再次重温写出各种SQL语句的时候,会用什么执行计划?(3).rar

    1. 使用EXPLAIN或EXPLAIN PLAN:在大多数数据库系统(如MySQL、PostgreSQL、Oracle等)中,可以在SQL语句前加上`EXPLAIN`或`EXPLAIN PLAN`关键字来查看执行计划。 2. 查询分析器:某些数据库管理系统(如SQL Server...

    java培训实习总结.doc

    在实习期间,学员们重温了Java的基础语法、类和对象的概念,以及异常处理等关键知识。 2. **JavaWeb开发**:JavaWeb技术包括Servlet和JSP,它们是构建动态Web应用的重要工具。Servlet是一个Java类,用于扩展服务器...

    2020年软件测试顶岗实习报告总结.docx

    (2) 工作方法:在编写测试用例的过程中,我重温了编程基础知识,并积极寻求同事的帮助。我认识到,不断积累知识和经验,以及将遇到的问题和解决方案铭记于心,是提升工作效率的关键。 (3) 工作责任:在公司,我视...

    SQL-4 数据库知识

    本文将深入探讨SQL的多个重要知识点,帮助读者重温或掌握这些基础概念。 1. 数据库基础 - 数据库:是存储和管理数据的系统,如Oracle、MySQL、SQL Server等。 - 关系型数据库:基于关系理论,通过表格形式展示...

    java培训实习报告.docx

    2. **Core Java**:从基础的变量、运算符到控制结构,实习生重温了Java的核心概念,这是所有Java开发的基础。 3. **SQL和数据库**:学习了SQL语言,包括基础和优化,以及Oracle数据库开发和PL/SQL,这是处理数据和...

    delphi7绿色精简版.rar

    5. **数据库支持**:Delphi 7内置了ADO(ActiveX Data Objects)组件,可以方便地连接和操作各种数据库,如SQL Server、Oracle、MySQL等。 6. **Unicode支持**:虽然Delphi 7相对较旧,但它已经支持Unicode,允许...

    PB学习手册附阅读器

    6. **数据库连接**:讲述如何配置数据源,使用ADO、ODBC或OLE DB等方式连接不同的数据库系统,如SQL Server、Oracle、MySQL等。 7. **应用程序部署**:介绍PB应用程序的编译、发布和部署过程,包括生成可执行文件和...

    Delphi 6企业版iso

    5. **数据库支持**:Delphi 6内置了对多种数据库的支持,包括InterBase、Oracle、SQL Server等,通过DataSnap和ADO组件,可以轻松实现数据库应用的开发。 二、Delphi 6的企业版特色: 1. **企业级组件**:Delphi 6...

    软件工程的实习报告4篇.pdf

    - 实习期间,学生重温了JAVA基础,Web设计,ORACLE数据库等关键技能。 - 强调了基础学习的重要性,特别是对于软件工程师而言,JAVA是必备技能。 - 学习了Web开发技术,理解了HTTP协议在B/S架构中的应用,掌握了...

    PB6.5.rar数据库维护软件

    4. **数据库连接性**:PB6.5支持多种数据库系统,如Oracle、MySQL、SQL Server、DB2等,这使得开发者能够轻松地与不同的数据库平台进行交互。 5. **脚本语言**:PB6.5使用的是PBL语言,这是一种基于Sybase的Simple ...

    陆卫康的VFP技术文章和示例

    5. **文件系统操作**:VFP提供了大量的系统函数和命令用于文件和目录的管理,方便进行文件读写和处理。 6. **网络与数据库连接**:VFP可以与其他数据库(如SQL Server、Oracle等)进行连接,实现数据交换和处理。 ...

    JavaBoyEMU

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)开发。Java以其“一次编写,到处运行”的理念闻名,因为Java代码会被编译成字节码,可以在任何支持Java的平台上运行。J2ME(Java 2...

    mapinfo 4 安装程序

    再者,MapInfo 4具备数据库集成能力,可以与多种数据库系统无缝对接,如Microsoft Access、Oracle和SQL Server等。这使得用户可以直接在GIS环境中进行数据库操作,实现地理数据与业务数据的结合。 安装过程中,用户...

    borland c biulder BC 编程工具

    8. **数据库集成**:BC++ Builder提供了与各种数据库系统的良好集成,包括InterBase、Oracle、SQL Server等,通过其DataSnap技术,可以轻松实现客户端和服务器之间的数据交换。 9. **文档和社区支持**:尽管这款...

    ArcGIS 9.3全套无限期许可文件

    它是一个高性能的空间数据库引擎,可以与多种关系型数据库管理系统(如Oracle、SQL Server等)无缝集成,实现大规模地理数据的存储、管理和查询。SDE服务器引擎的无限期许可意味着用户可以在不受时间限制的情况下,...

Global site tag (gtag.js) - Google Analytics