`

Oracle数据库中如何选择合适的索引类型

    博客分类:
  • SQL
阅读更多

    索引就好象一本字典的目录。凭借字典的目录,我们可以非常迅速的找到我们所需要的条目。数据库也是如此。凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表。

  虽然说,在表中是否创建索引,不会影响到Oracle数据库的使用,也不会影响数据库语句的使用。这就好像即使字典没有目录的话,用户仍然可以使用它一样。可是,若字典没有目录,那么可想而知,用户要查某个条目的话,其不得不翻遍整本字典。数据库也是如此。若没有建立相关索引的话,则数据库在查询记录的时候,不得不去查询整个表。当表中的记录比较多的时候,其查询效率就会很低。所以,合适的索引,是提高数据库运行效率的一个很好的工具。

  不过,并不是说表上的索引越多越好。过之而不及。故在数据库设计过程中,还是需要为表选择一些合适的索引。宁缺勿滥,这是建立索引时的一个遵循标准。在理论上,虽然一个表可以设置无限的索引。但是,数据库管理员需要知道,表中的索引越多,维护索引所需要的开销也就越大。每当数据表中记录有增加、删除、更新变化的时候,数据库系统都需要对所有索引进行更新。故数据库表中的索引绝对不是多多益善。具体来说,在索引建立上,笔者对大家有如下建议。

  建议一:在基数小的字段上要善于使用位图索引。

  基数是位图索引中的一个基本的定义,它是指数据库表中某个字段内容中不重复的数值。如在员工信息表中的性别字段,一般就只有男跟女两个值,所以,其基数为2;婚姻状况字段的话,则其只有已婚、未婚、离婚三种状态,其基数就为3;民族一览内也是只有有限的几个值。

  对于要查询基数小的字段,如现在用户想查找所有婚姻状况为“已婚”的“女性”时,利用位图索引可以提高查询的效率。这主要是因为标准索引是通过在索引中保存排序过的索引列以及对应的ROWID来实现的。若我们在基数小的列上建立标准索引的话,则其会返回大量的记录。

  而当我们在创建位图索引的时候,在Oracle会对整个表进行扫描,并且会为索引列的每个取值建立一个位图。若内容相同,则在位图上会以一个相同的数字表示。此时,若这个字段的基数比较小的话,则若需要实现对整个字段的查询的话,效率就会非常的高。因为此时,数据库只要位图中数字相同的内容找出来即可。

  除了在数据表某列基数比较小的情况下,采用位图索引外,我们往往在一些特殊的情况下,也会建议采用位图索引。最常见的情况是,在Where限制条件中,若我们多次采用AND或者OR条件时,也建议采用位图索引。因为当一个查询饮用了一些部署了位图索引的列的时候,这些位图可以很方便的与AND或者Or 运算符操作结合以快速的找出用户所需要的记录。

  但是,这里要注意,不是在条件语句中包含运算符的时候,采用位图索引都能够提供比较高的效率。一般来说,只有AND 或者OR运算符的时候,位图索引才会比较具有优势。若此时用户采用大于号或者不等于号作为条件语句中的限制条件的时候,则往往采用标准索引具有更大的优势。

  所以,笔者在数据库设置中,一般只有在三种情况下才采用位图索引。一是列的基数比较小,而有可能需要根据这些字段的内容查找相关的记录;二是在条件语句中,用到了AND或者OR运算符的时候。除了这两种情况外,最好能够采用其他适合的索引。第三种情况是,需要用到NULL作为查询的限制条件。因为标准查询一般情况下,会忽略所有的NULL值列。也就是说,若需要查询“所有没有身份证号码”的员工的信息的时候,标准索引并不能够起到加速查询速度的作用。此时,就需要采用位图索引。因为位图索引会记录相关的NULL值列信息。

  建议二:创建索引的一些限制条件。

  并不说,表或者列建立的索引越多越好。相反,索引建的越多,有时会反而会影响数据库运行的整体性能。所以,在建立索引的时候,仍然会有一些限制条件。

  一是不要对一些记录内容比较少的表建立索引。在一个应用系统设计的时候,如设计一个ERP系统的数据库,其虽然有几千张表。但是,并不是每张表都有大量记录的。相反,其中有近一半左右的数据表,可能其存储的数据不会超过百条。如员工登陆帐户密码表、企业部门信息表等等。对于这些记录内容比较少的表,我们建立最好不要为其建立索引。无论是表上的,还是字段上,都不要建立索引。

  二是若表中的内容比较大,但是,这个表基本上不怎么查询的时候,则只需要在表上建立索引即可;而不需要在字段上建立索引。如现在在ERP系统中,有一张表是“AD_Table”。其存储的是这个数据库中相关表的信息。这张表只有在数据库设计的时候才会用到。故这张表中的记录虽然比较多,但是由于用户用的比较少,所以,一般没有必要为这张表建立列级别上的索引。而直接用表索引来代替。

  三是在一些NULL字段上,要根据实际情况来判断是否要建立索引。如现在有一张人事档案的表格,其上面有两个字段,分别为“身份证号码”与“地区”。有时会为了某个原因,企业需要所有员工都在系统中登记他们的身份证号码,以方便他们办工资卡、社会保险等等。所以人事管理可能需要经常的查询系统,看看有没有没有身份证号码的员工信息。此时,就需要利用条件“IS NULL”来查询我们所需要的记录。故为了提高查询效率,若某个记录可能为空,并且经常需要以NULL为条件进行查询的时候,则最好给这个字段添加一个索引,并且最好建立位图索引。相反,若虽然可能会以NULL这个条件作为查询的限制语句,但是,用的不是很多的时候,则就没有必要为其建立索引。

  建议三:多表连接查询的索引设计。

  如现在有一个人事管理系统。人事经理想知道员工的社保缴纳情况。他需要知道员工的姓名、职务、户籍性质(农民户口跟居民户口费用不一样)、缴纳的情况等等。但是,这些信息包含在不同的表中。因为为了提高数据库的性能,在表中存储的可能只是某些序号,而不是具体的内容。如在社保表中,存储的是员工对应的编号,而不是员工的名字。所以,要得到这份报表的话,就可能需要关联员工基本信息表、公司组织结构表等表格,才能够查询到用户所需要的内容。

  为此,就需要利用Join语句,把这些表格关联起来。为了提高数据库的查询效率,这些用来关联的字段,最好能够建立索引。这可以显著的提高查询的速度。

  建议四:在表的更新速度与查询速度之间寻求一个平衡点。

  众所周知,索引本身并不影响数据库的使用,其主要是为了提高数据库的查询效率。但是,由于当数据库的表中的数据更新的时候,包括记录的增加、删除、更改等等,都会对虽有的索引进行更新。

  很明显,索引虽然可以提高查询速度。但是,也会对一些表的更新操作产生不良的影响。当在表中建立的索引越多,这个不利影响也会越大。故数据库管理员在设置索引的时候,还需要注意,在这两个之间需要一个均衡点。

  按照一般的理论来说,当某个表多数用来查询、更新相对来说比较上的话,则要多多采用索引。相反,当某个表记录更新居主导,查询相对来说比较少的话,则不要建立太多的索引,避免对更新的速度差生不利影响。

  在实际工作中,若某个表频繁的被视图所调用的话,则最好就好设置比较多的索引了。

1、在有索引的表上执行DML操作性能会变慢,因为同时要往表和索引插入数据。

2、当表中如果有组合索引时,如create index idx_tables on t_user_info(id,name,address);
   使用select语句进行查询时,where条件中一定要用到前导引,这样oracle才能用到该索引进行扫描,
   否则就进行全表扫描。

3、索引只能用于查找表中已经存在的数据。如果查询语句中有<>或!=的时候,oracle同样不会用到索引,
   解决方案:可以用 where t.name>'huangyun' or t.name<'huangyun'

4、避免使用is null或者 not null。使用技巧:null关键字通常会限制使用索引,所以在create table的
   时候尽量使用not null或者default,这样可以避免出现性能的问题。

2.11 索引的类型有: B-树索引,位图索引,hash索引,索引编排表,反转键索引,基于函数的索引,分区索引
     本地和全局索引。
   
    2.11.1 B-树索引是oracle中的通用索引,也是oracle中的默认索引,当创建索引时如果不指定特定的索引类型
           oracle则默认的是B-树索引。B-树索引可以一个列上的索引,也可以是多列上的索引,但指定的列不能
           超过32列。索引只能在有值的列上有作用。

    2.11.6 基于函数的索引,在创建索引是可以使用
           create index idx_user_info_name on userinfo(max(name))
           于是在使用查询语句的时候 select * from userinfo t where max(name)='huangyun'
           就已经使用了该列上的索引,但创建这种索引的时候一定要谨慎,需要考虑额外的代价。
    基于函数的索引的实例如下
    select count(1) from userinfo where ratio(name,age)>5; finished 20分钟
    create index idx_ratio_userinfo on userinfo(name,age);
    select count(1) from userinfo where ratio(name,age)>5; finished 7秒钟
    //ratio函数是自定义的函数。

    2.11.7分区索引
          分区索引简单的说就是把一个索引划分为多个片断,并且这些片断可以分布在不同的硬盘上。
          B-索引和位图索引可以建立分区索引,但hash索引不可以被分区??
         


分享到:
评论

相关推荐

    oracle、sql数据库批量建索引

    索引类型的选择也非常重要,如B树索引、位图索引、全文索引等,每种类型都有其适用的场景。例如,位图索引适合于在低基数(unique values比例低)的列上,而全文索引则适用于文本搜索。 "iTelluro.Tools.SqlIndex...

    Oracle数据库索引的维护

    ### Oracle数据库索引的维护 在Oracle数据库管理与优化的过程中,索引的维护是非常关键的一环。合理地创建、管理和优化索引能够显著提高查询性能,降低系统的响应时间,从而提升整个应用程序的效率。本文将从Oracle...

    ORACLE数据库 ORACLE数据库

    - **安装与配置**:包括选择合适的安装类型、设置初始化参数、创建数据库实例等步骤。 - **数据导入导出**:使用`expdp`和`impdp`工具进行数据的备份和恢复。 - **备份与恢复**:Oracle提供RMAN(恢复管理器)...

    ORACLE数据库设计与优化

    1. 准确选择索引类型:B树索引、位图索引、函数索引等,根据查询条件和数据分布选择合适的索引类型。 2. 使用索引覆盖:确保查询所需的全部列都在索引中,从而避免回表操作。 五、存储过程与触发器 1. 存储过程:将...

    ORACLE数据库索引工作原理

    通过两个图形说明了在oracle数据库中b-tree索引和位图索引的工作原理

    Oracle数据库中的索引管理技术.pdf

    Oracle数据库中的索引管理技术 索引是 Oracle 数据库中的一个重要对象,它可以大大提高数据库中的数据检索速度。索引是包含表中选定字段的信息的对象,这些信息以某种规律排序,有一个指针指向存放实际数据的记录。...

    Oracle数据库资料大全

    Oracle数据库系统基于SQL标准,采用分布式数据库架构,支持多种数据类型,如数值、字符串、日期、二进制等。其主要组件包括数据库实例、表空间、数据文件、控制文件、重做日志文件等。数据库实例是内存结构与后台...

    数据库 创建索引 sql oracle

    索引的优化包括选择正确的索引类型、选择正确的索引字段、优化索引的填充因子、优化索引的 Statistics 等。 创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。但是,索引的创建和管理需要遵循一定的...

    Oracle数据库使用指南

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,尤其在企业级应用中占据主导地位。本指南将针对初学者,详细介绍Oracle数据库的基础知识、安装与配置,以及一些常用的操作和管理技巧。 **1. Oracle...

    oracle数据库实例视频教程01

    Oracle数据库是一种广泛应用于企业级数据管理的高性能关系型数据库系统,尤其在大型企业和金融机构中有着广泛应用。本"Oracle数据库实例视频教程01"是针对初学者和希望深化Oracle知识的人员设计的一系列教学资源,...

    Oracle数据库应用课件

    Oracle数据库的安装可能涉及单实例、RAC(Real Application Clusters)集群等多种模式,需要根据实际环境选择合适的安装方法。 最后,“SQL*PLUS”是Oracle提供的一个命令行工具,用于与数据库交互。学习者将学习...

    Oracle数据库实用教程

    2. **安装与配置**:Oracle数据库的安装涉及选择合适的版本、操作系统兼容性、硬件需求等。配置包括创建数据库实例、设置监听器、初始化参数文件(init.ora)的配置、网络服务命名(如tnsnames.ora)等。 3. **数据...

    Oracle数据库对象管理及备份与恢复.pdf

    Oracle中常见的索引类型包括B树索引、位图索引和反向键索引。B树索引是默认和最常用的类型,适用于大多数场景;位图索引适合基数较低的列;反向键索引适用于特定的使用情况。此外,还有基于函数的索引和分区索引。...

    oracle数据库简单介绍

    4. **Oracle数据库安装教程**:安装Oracle数据库涉及多个步骤,包括选择适当的版本(如Oracle Database 19c)、配置硬件和操作系统要求、下载安装文件、执行安装向导、配置网络服务、创建数据库实例等。安装过程中需...

    Oracle 数据库的位图索引原理与应用.pdf

    Oracle 数据库的位图索引原理与应用 Oracle 数据库中的位图索引是一种特殊类型的索引,主要用于解决查询优化问题。 在实际应用中,列值重复率...但是,位图索引也存在一些限制,需要根据实际情况选择合适的索引类型。

    oracle数据库学习宝典

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在企业级数据管理中扮演着至关重要的角色。本"Oracle数据库学习宝典"旨在帮助你全面掌握Oracle数据库的核心概念和技术,包括视图、存储过程、索引、触发器...

    《Oracle数据库性能优化实践指南》PDF

    书中将讨论如何合理组织表和索引,包括选择合适的数据类型、压缩技术以及物理存储结构(如簇、索引组织表等),以降低存储需求并提高访问效率。 最后,本书还会涉及Oracle数据库的监控和维护,包括定期性能基准测试...

    ORACLE 数据库入门教程

    Oracle数据库中的主要对象包括表、视图、索引、存储过程、触发器和游标等。学习如何创建和管理这些对象,可以提高数据管理效率。 六、PL/SQL编程 PL/SQL是Oracle特有的过程化语言,结合了SQL的查询能力与高级编程...

    oracle数据库各版本驱动

    在给定的压缩包中,包含了从ojdbc5到ojdbc11的多个版本,覆盖了Oracle数据库的不同版本兼容需求。 1. **ojdbc5**: 这个版本的驱动对应于Java 5,支持Oracle 10g和11g数据库。它的全称为Oracle JDBC Thin Driver,是...

Global site tag (gtag.js) - Google Analytics