`

索引的好处与缺点

阅读更多
来于互联网********************************************************************************
http://blog.163.com/idea_/blog/static/18097026220117268215763/

?创建索引的好处

–帮助用户提高查询速度

–利用索引的唯一性来控制记录的唯一性

–可以加速表与表之间的连接

–降低查询中分组和排序的时间

?创建索引的坏处

–存储索引占用磁盘空间

–执行数据修改操作(INSERT、UPDATE、DELETE)产生索引维护

----------------------------------------------------------------------------------------------

索引是提高数据查询最有效的方法,也是最难全面掌握的技术,因为正确的索引可能使效率提高10000倍,而无效的索引可能是浪费了数据库空间,甚至大大降低查询性能。

  索引的管理成本

  1、 存储索引的磁盘空间

  2、 执行数据修改操作(INSERT、UPDATE、DELETE)产生的索引维护

  3、 在数据处理时回需额外的回退空间。

  实际数据修改测试:

  一个表有字段A、B、C,同时进行插入10000行记录测试

  在没有建索引时平均完成时间是2.9秒

  在对A字段建索引后平均完成时间是6.7秒

  在对A字段和B字段建索引后平均完成时间是10.3秒

  在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒

  从以上测试结果可以明显看出索引对数据修改产生的影响

  索引按存储方法分类

  B*树索引

  B*树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目录,叶块相当于索引到的具体的书页。一般索引及唯一约束索引都使用B*树索引。

  位图索引

  位图索引储存主要用来节省空间,减少ORACLE对数据块的访问,它采用位图偏移方式来与表的行ID号对应,采用位图索引一般是重复值太多的表字段。位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,ORACLE每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数据仓库技术,所以大量数据采用位图索引节省空间比较明显。

  索引按功能分类

  唯一索引

  唯一索引有两个作用,一个是数据约束,一个是数据索引,其中数据约束主要用来保证数据的完整性,唯一索引产生的索引记录中每一条记录都对应一个唯一的ROWID。

  主关键字索引

  主关键字索引产生的索引同唯一索引,只不过它是在数据库建立主关键字时系统自动建立的。

  一般索引

  一般索引不产生数据约束作用,其功能主要是对字段建立索引表,以提高数据查询速度。

  索引按索引对象分类

  单列索引(表单个字段的索引)

  多列索引(表多个字段的索引)

  函数索引(对字段进行函数运算的索引)

  建立函数索引的方法:

  create index 收费日期索引 on GC_DFSS(trunc(sk_rq))

  create index 完全客户编号索引 on yhzl(qc_bh||kh_bh)

  在对函数进行了索引后,如果当前会话要引用应设置当前会话的query_rewrite_enabled为TRUE。

  alter session set query_rewrite_enabled=true

  注:如果对用户函数进行索引的话,那用户函数应加上 deterministic参数,意思是函数在输入值固定的情况下返回值也固定。例:

  create or replace function trunc_add(input_date date)return date deterministic

  as

  begin

  return trunc(input_date+1);

  end trunc_add;

  应用索引的扫描分类

  INDEX UNIQUE SCAN(按索引唯一值扫描)

  select * from zl_yhjbqk where hbs_bh='5420016000'

  INDEX RANGE SCAN(按索引值范围扫描)

  select * from zl_yhjbqk where hbs_bh>'5420016000'

  select * from zl_yhjbqk where qc_bh>'7001'

  INDEX FAST FULL SCAN(按索引值快速全部扫描)

  select hbs_bh from zl_yhjbqk order by hbs_bh

  select count(*) from zl_yhjbqk

  select qc_bh from zl_yhjbqk group by qc_bh

  什么情况下应该建立索引

  表的主关键字

  自动建立唯一索引

  如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号)

  表的字段唯一约束

  ORACLE利用索引来保证数据的完整性

  如lc_hj(流程环节)中的lc_bh+hj_sx(流程编号+环节顺序)

  直接条件查询的字段

  在SQL中用于条件约束的字段

  如zl_yhjbqk(用户基本情况)中的qc_bh(区册编号)

  select * from zl_yhjbqk where qc_bh=’7001’

  查询中与其它表关联的字段

  字段常常建立了外键关系

  如zl_ydcf(用电成份)中的jldb_bh(计量点表编号)

  select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=’540100214511’

  查询中排序的字段

  排序的字段如果通过索引去访问那将大大提高排序速度

  select * from zl_yhjbqk order by qc_bh(建立qc_bh索引)

  select * from zl_yhjbqk where qc_bh='7001' order by cb_sx(建立qc_bh+cb_sx索引,注:只是一个索引,其中包括qc_bh和cb_sx字段)

  查询中统计或分组统计的字段

  select max(hbs_bh) from zl_yhjbqk

  select qc_bh,count(*) from zl_yhjbqk group by qc_bh

  什么情况下应不建或少建索引

  表记录太少

  如果一个表只有5条记录,采用索引去访问记录的话,那首先需访问索引表,再通过索引表访问数据表,一般索引表与数据表不在同一个数据块,这种情况下ORACLE至少要往返读取数据块两次。而不用索引的情况下ORACLE会将所有的数据一次读出,处理速度显然会比用索引快。

  如表zl_sybm(使用部门)一般只有几条记录,除了主关键字外对任何一个字段建索引都不会产生性能优化,实际上如果对这个表进行了统计分析后ORACLE也不会用你建的索引,而是自动执行全表访问。如:

  select * from zl_sybm where sydw_bh='5401'(对sydw_bh建立索引不会产生性能优化)

  经常插入、删除、修改的表

  对一些经常处理的业务表应在查询允许的情况下尽量减少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等业务表。

  数据重复且分布平均的表字段

  假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。

  经常和主字段一块查询但主字段索引值比较多的表字段

  如gc_dfss(电费实收)表经常按收费序号、户标识编号、抄表日期、电费发生年月、操作标志来具体查询某一笔收款的情况,如果将所有的字段都建在一个索引里那将会增加数据的修改、插入、删除时间,从实际上分析一笔收款如果按收费序号索引就已经将记录减少到只有几条,如果再按后面的几个字段索引查询将对性能不产生太大的影响。

  如何只通过索引返回结果

  一个索引一般包括单个或多个字段,如果能不访问表直接应用索引就返回结果那将大大提高数据库查询的性能。对比以下三个SQL,其中对表zl_yhjbqk的hbs_bh和qc_bh字段建立了索引:

  1 select hbs_bh,qc_bh,xh_bz from zl_yhjbqk where qc_bh=’7001’

  执行路径:

  SELECT STATEMENT, GOAL = CHOOSE 11 265 5565

  TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 5565

  INDEX RANGE SCAN DLYX 区册索引 1 265

  平均执行时间(0.078秒)

  2 select hbs_bh,qc_bh from zl_yhjbqk where qc_bh=’7001’

  执行路径:

  SELECT STATEMENT, GOAL = CHOOSE 11 265 3710

  TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 3710

  INDEX RANGE SCAN DLYX 区册索引 1 265

  平均执行时间(0.078秒)

  3 select qc_bh from zl_yhjbqk where qc_bh=’7001’

  执行路径:

  SELECT STATEMENT, GOAL = CHOOSE 1 265 1060

  INDEX RANGE SCAN DLYX 区册索引 1 265 1060

  平均执行时间(0.062秒)

  从执行结果可以看出第三条SQL的效率最高。执行路径可以看出第1、2条SQL都多执行了TABLE ACCESS BY INDEX ROWID(通过ROWID访问表) 这个步骤,因为返回的结果列中包括当前使用索引(qc_bh)中未索引的列(hbs_bh,xh_bz),而第3条SQL直接通过QC_BH返回了结果,这就是通过索引直接返回结果的方法。

  如何重建索引

  alter index 表电量结果表主键 rebuild

  如何快速新建大数据量表的索引

  如果一个表的记录达到100万以上的话,要对其中一个字段建索引可能要花很长的时间,甚至导致服务器数据库死机,因为在建索引的时候ORACLE要将索引字段所有的内容取出并进行全面排序,数据量大的话可能导致服务器排序内存不足而引用磁盘交换空间进行,这将严重影响服务器数据库的工作。解决方法是增大数据库启动初始化中的排序内存参数,如果要进行大量的索引修改可以设置10M以上的排序内存(ORACLE缺省大小为64K),在索引建立完成后应将参数修改回来,因为在实际OLTP数据库应用中一般不会用到这么大的排序内存。
分享到:
评论

相关推荐

    索引的优点和缺点

    索引的优点和缺点,如何建立索引,索引的特征

    数据库索引的优缺点及其附加资料

    本文档详细说明了什么时候创建索引;创建索引的优缺点等

    索引优点及缺点

    用于数据库学习,阐述数据索引的优点及缺点.详细说明

    SQL Server 索引结构及其使用(聚集索引与非聚集索引)

    "SQL Server 索引结构及其使用(聚集索引与非聚集索引)" 数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍...

    数据库索引设计与优化

    二、索引的优点与缺点 优点: 1. 加速查询:通过索引,数据库可以直接定位到数据行,减少磁盘I/O操作。 2. 提高排序和分组速度:利用索引,数据库可以在排序或分组时减少数据处理量。 3. 支持唯一性约束:唯一索引...

    数据库索引的作用与优缺点.doc

    数据库索引的作用与优缺点 数据库索引是指在数据库表中的某些列上创建的数据结构,旨在提高数据检索和维护的速度。创建索引可以大大提高系统的性能,确保数据库表中每一行数据的唯一性,加快数据的检索速度,提高表...

    关于索引概念\特点\优点\缺点\分类\使用

    简要概述索引的概念\特点\优点\缺点\分类\使用

    数据库索引的优缺点及使用时的注意事项.docx

    然而,索引并非无懈可击,它们也有其优缺点,并需要根据特定场景谨慎使用。 **优点:** 1. **提高查询速度**:索引为数据库提供了一种快速查找数据的方式,特别是对于大数据量的表,索引可以显著减少查询时间。 2. ...

    数据库索引的作用和优点缺点

    什么是索引  拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K 。为了加快查找的速度,汉语字(词)典一般都有按拼音、笔画、偏旁...

    SQLSEVER索引和索引调整向导

    * 聚簇索引与基表的物理顺序相同,非聚簇索引与基表的物理顺序不相同。 * 索引既可以直接创建,也可以间接创建。 * 可以在优化隐藏中使用索引。 * 使用查询处理器执行 SQL 语句,在一个表上一次只能使用一个索引。 *...

    数据库中索引的优缺点

    一、索引的概念  索引是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而...

    第A章习题(索引与散列).doc

    然而,其缺点在于对数据的插入、删除操作效率较低,因为需要调整整个索引结构。 动态索引结构:这种索引会随着数据的增加或删除实时调整其结构,以保持高效的搜索性能。优点在于能自适应数据变化,但缺点是实现算法...

    postgresql索引类型区别

    Hash 索引的缺点在于,它们不适用于大于、小于或 BETWEEN 查询,并且在 OLTP 数据库中使用 Hash 索引的表进行 DML 操作时,会增加 CPU 开销和存储消耗。 B-tree 索引 ------------ B-tree 索引是 PostgreSQL 中最...

    mysql索引与视图的实例附答案宣贯.pdf

    mysql索引与视图实例附答案宣贯 在本篇文章中,我们将探讨 MySQL 中的索引和视图这两个重要概念,并通过实例和答案来宣贯相关知识点。 索引概念: 索引是一种数据结构,它可以提高查询的速度。索引可以创建在表上...

    数据库索引那些事(数据库索引原理)

    "数据库索引那些事(数据库索引原理)" 数据库索引是数据库的一种对象,它保存数据库...数据库索引是数据库查询性能优化的重要手段,它可以提高查询速度、减少 I/O 操作,但是也需要注意索引的使用注意事项和优缺点。

    oracle的索引学习

    本篇文章将深入探讨Oracle索引的学习,重点关注索引的原理、类型、优缺点以及如何使用和分析执行计划。 首先,理解索引的基本概念。索引是一种特殊的数据结构,它存储在表空间中,用于加速对表数据的访问。当执行...

    数据库原理与运用(索引管理)

    本篇文章将深入探讨索引的概念、作用、优缺点以及如何创建和管理索引。 索引如同书籍的目录,为数据库提供快速访问数据的能力。创建索引可以显著提高数据检索速度,确保数据的唯一性,并加速表间连接。在使用分组和...

    MySql索引详解,索引可以大大提高MySql的检索速度

    创建索引时,你需要确保该索引是应用在SQL查询语的条件(一般作为WHERE 子句的条件)实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。上面都在说使用索引的好处,但过多的使用索引将会造成...

Global site tag (gtag.js) - Google Analytics