在Oracle数据库中,创建索引虽然比较简单。但是要合理的创建索引则比较困难了。笔者认为,在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的索引。虽然这可以通过一句话来概括优化的索引的基本准则,但是要做到这一点的话,需要数据库管理员做出很大的努力。具体的来说,要做到这个三个适当有如下几个要求。
一、 根据表的大小来创建索引。
虽然给表创建索引,可以提高查询的效率。但是数据库管理员需要注意的是,索引也需要一定的开销的。为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能。这个认识是错误的。恰恰相反,如果不管三七二十一,给所有的表都创建了索引,那么其反而会给数据库的性能造成负面的影响。因为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。所以笔者认为,数据库管理员首先需要做到,为合适的表来建立索引,而不是为所有的表建立索引。
一般来说,不需要为比较小的表创建索引。如在一个ERP系统的数据库中,department表用来存储企业部门的信息。一般企业的部分也就十几个,最多不会超过一百个。这100条记录对于人来说,可能算是比较多了。但是对于计算机来说,这给他塞塞牙缝都还不够。所以,对类似的小表没有必要建立索引。因为即使建立了索引,其性能也不会得到很大的改善。相反索引建立的开销,如维护成本等等,要比这个要大。也就是说,付出的要比得到的多,显然违反常理。
另外,就是对于超大的表,也不一定要建立索引。有些表虽然比较大,记录数量非常的多。但是此时为这个表建立索引并一定的合适。如系统中有一张表,其主要用来保存数据库中的一些变更信息。往往这些信息只给数据库管理员使用。此时为这张表建立索引的话,反而不合适。因为这张表很少用到,只有在出问题的时候才需要查看。其次其即使查看,需要查询的纪录也不会很多,可能就是最近一周的更新记录等等。对于对于一些超大的表,建立索引有时候往往不能够达到预计的效果。而且在打表上建立索引,其索引的开销要比普通的表大的多。那么到底是否给大表建立索引呢?笔者认为,主要是看两个方面的内容。首先是需要关注一下,在这张大表中经常需要查询的记录数量。一般来说,如果经常需要查询的数据不超过10%到15%的话,那就没有必要为其建立索引的必要。因为此时建立索引的开销可能要比性能的改善大的多。这个比例只是一个经验的数据。如果数据库管理员需要得出一个比较精确的结论,那么就需要进行测试分析。即数据库管理员需要测试一下全表扫描的时间,看看其是否比建立索引后的查询时间要长或者短。如果是长的话,则说明有建立索引的必要。但是如果没有的话,则说明还是全表扫描速度来的快。此时也就没有必要建立索引了。
总之,在考虑是否该为表建立索引时,一般来说小表没有建立索引的必要。而对于打表的话,则需要进行实际情况实际分析。简单一点的,可以根据大致的比率来确定。如果要精确一点的,则可以进行全表扫描性能分析,以判断建立索引后是否真的如预期那样改善了数据库性能。
二、 根据列的特征来创建索引。
列的特点不同,索引创建的效果也不同。数据库管理员需要了解为哪些列创建索引可以起到事倍功半的效果。同时也需要了解为哪些列创建索引反而起到的是事倍功半的效果。这有利于他们了解到底给为怎么样的字段建立索引。
根据笔者的经验,往往为如下特征的列创建索引能够起到比较明显的效果。如对于一些重复内容比较少的列,特别是对于那些定义了唯一约束的列。在这些列上建立索引,往往可以起到非常不错的效果。如对于一些null值的列与非Null值的列混合情况下,如果用户需要经常查询所有的非Null值记录的列,则最好为其设置索引。如果经常需要多表连接查询,在用与连接的列上设置索引可以达到事半功倍的效果。
可见,索引设置的是否恰当,不仅跟数据库设计架构有关,而且还跟企业的经济业务相关。为此,对于一些套装软件,虽然一开始数据库管理员已经做了索引的优化工作。但是随着后来经济数据的增加,这个索引的效果会越来越打折扣。这主要是因为记录的表化影响到了索引优化的效果。所以笔者建议各位数据库管理员,即使采用的是大牌软件公司的套装软件,也需要隔一段时间,如一年,对数据库的索引进行优化。该去掉的去掉,该调整的调整,以提高数据库的性能。
如在数据库中有一张表是用来保存用户信息的。其中有个字段身份证号码,这是一个唯一的字段。在数据库设计时,给这个字段创建了索引。但是当这个数据库投入使用之后,用户不怎么输入用户的身份证号码。而且平时也基本不按这个号码来进行查询。当记录月来月多时,这个身份证号码上的索引字段不但不能够改善数据库的查询性能,反而成了鸡肋。对于这些有很多NULL值的列,而且不会经常查询所有的非NULL值记录的列,数据库管理员要下决心,即使清除这些列上的索引。
所以说索引的优化与调整是一个动态的过程,并不是说数据库设计好之后就不需要经过调整。数据库管理员往往需要根据记录的变化情况,来进行适当的变更。以提高索引的效果。
三、 在一个表上创建多少索引合适?
虽然说,在表上创建索引的数量没有限制,但是决不是越多越好。也就是说,在创建索引这项事情上,1+1〉2往往不成立。有时候,创建索引越多,其可能会得到适得其反的效果。那么在一个表上,到底给创建多少索引合适呢?这个没有一个明确的标准。而是需要数据库管理员根据实际的用途以及数据库中记录的情况,来进行判断。
通常来说,表的索引越多,其查询的速度也就越快。但是,表的更新速度则会降低。这主要是因为表的更新(如往表中插入一条记录)速度,反而随着索引的增加而增加。这主要是因为,在更新记录的同时需要更新相关的索引信息。为此,到底在表中创建多少索引合适,就需要在这个更新速度与查询速度之间取得一个均衡点。如对于一些数据仓库或者决策型数据库系统,其主要用来进行查询。相关的记录往往是在数据库初始化的时候倒入。此时,设置的索引多一点,可以提高数据库的查询性能。同时因为记录不怎么更新,所以索引比较多的情况下,也不会影响到更新的速度。即使在起初的时候需要导入大量的数据,此时也可以先将索引禁用掉。等到数据导入完毕后,再启用索引。可以通过这种方式来减少索引对数据更新的影响。相反,如果那些表中经常需要更新记录,如一些事务型的应用系统,数据更新操作是家常便饭的事情。此时如果在一张表中建立过多的索引,则会影响到更新的速度。由于更新操作比较频繁,所以对其的负面影响,要比查询效率提升要大的多。此时就需要限制索引的数量,只在一些必要的字段上建立索引。
笔者在平时数据库优化时,往往会根据这些表的用途来为列设置索引。可以查询相关的动态视图,看看对于这张表的操作,是更新操作(包括更新、删除、插入等等)占的比例大,还是查询操作占的比例大。当过多的索引已经影响到更新操作的速度时,则数据库管理员就需要先禁用某些索引,以提高数据库的性能。
总之,在适当的表、适当的列上建立适当的索引。这一句话包含的意思有很多,以上内容只是一部分内容。俗话说,师傅领进门,修行靠自身。笔者在这里指能够点到为止。一些具体的索引优化内容还是需要各位读者在日常工作中去体会与总结。
分享到:
相关推荐
本文将围绕“基于合理索引的数据库查询优化”这一主题展开讨论,重点介绍数据库索引的基本概念、作用以及两种主要索引结构(聚集索引与非聚集索引)的区别,并通过实例分析如何构建合理的索引来优化数据库查询。...
2. 索引建立时机 在数据库的日常运维过程中,DBA(数据库管理员)需要判断何时建立索引以及何时需要对索引进行维护。通常,对于经常用于查询条件的列,特别是那些用于关联查询、排序和分组的列,建立索引是非常必要...
索引是数据库中用于加速数据检索的一种特殊数据结构。它包含了表中某些列的值及其对应的记录位置,使得查找数据变得更快。 **优点:** 1. **提高查询速度:** 索引能显著提升查询数据的速度。 2. **保证数据唯一性...
首先,要对数据库的存储结构进行评估,包括数据表和索引的位置,以及预估所需空间。合理的存储规划可以显著提升数据访问性能。例如,重置日志文件应放置在独立的磁盘或RAID 1阵列,而数据文件则放在RAID 5阵列上,以...
- **连接索引**:连接索引是在两个或多个表之间建立的一种索引形式,可以优化多表连接查询的性能。 #### 3. 组合索引的使用方法 - **定义**:组合索引是指在一个索引中包含了多个列。这种方式可以支持包含多个列的...
进入概要设计阶段,数据库的总体结构开始建立,包括全局数据库和数据结构的设计,以及设计约束的规划。这一阶段会产出概要设计规格说明书,其中包含了数据库设计的初步蓝图。接下来的详细设计阶段,数据库的每个模块...
1. **建立索引的时机选择**: 在处理大量数据时,建立索引是提升查询性能的重要手段。理想的做法是在数据插入前创建索引,但这样会增加日志空间的需求,降低插入速度。为避免这种情况,可以选择不计日志方式插入...
建立索引的时机应考虑以下几个方面: 1. 主键自动创建唯一索引。 2. 经常出现在WHERE子句中的字段。 3. 与其他表关联的外键字段。 4. 高并发场景下,创建组合索引可提高效率。 5. 排序和分组字段。 6. 统计字段。 ...
5. 在倒排文件中,如果只建立了部分关键字的辅索引,查找时需先通过主索引找到对应记录,再利用辅索引查找特定关键字。 五、综合题 这部分通常需要考生根据给定的关系模式,解决实际问题,例如查询、更新操作、...
5. **索引优化**:选择合适的字段建立索引,避免在经常删除的字段上建索引,考虑位映射索引和函数索引。 6. **SQL语句优化**:避免全表扫描,使用Decode减少扫描,使用TRUNCATE替代DELETE,用EXISTS替代IN,优化表...
1. **建立索引的时机**:索引应当在那些频繁出现在查询条件、排序或分组中的字段上创建。例如,如果一个字段经常用于`SELECT`查询的`WHERE`子句,那么为这个字段创建索引将有助于加速查询。同时,如果字段用于连接...
在实际应用中,对比现有索引与生成的新索引,选择合适的时机(如业务低峰期)执行DROP和CREATE索引的脚本,以最小化对在线服务的影响。值得注意的是,对于执行频率较低的简单查询,其执行计划可能因缓存清理而丢失,...
索引是数据库管理系统为了提高查询效率而建立的数据结构。随着数据的增删改查操作,索引可能会变得不那么高效,甚至可能导致性能下降。因此,在某些情况下,考虑重建索引是非常必要的。 **考虑重建索引的情况包括但...
- 索引是在列上建立的一种数据库对象(B)。 - 索引的建立和撤消不会直接影响表中的数据(C)。 - 表的撤消会同时撤消在其上的索引(D)。 3. **聚集与非聚集索引**: - 每个表可以有多个非聚集索引(A错误)。...
- 用户数据库:创建、更新、索引建立或执行不记录日志的命令后。 10.1.5 限制的操作 - 备份期间不允许创建或删除数据库文件、创建索引、执行不记日志的命令。 10.1.6 备份类型 - 完整备份:包含所有数据和部分事务...
在倒排文件中,如果只建立了部分关键字的辅助索引,查找时需先根据主索引找到对应的记录范围,然后在该范围内使用辅索引来定位具体记录。 最后,综合题通常会涉及具体的数据库设计和查询操作,例如学生课程数据库的...
1. **创建索引的时机**:在表中插入数据后,尤其是使用`SQL*Loader`或`import`工具批量加载数据之后,创建索引通常更为高效。 2. **选择合适的表和列**:对于经常检索的大表,如果返回的记录数小于一定比例,建议...
创建索引对SQL语句执行的影响是Oracle数据库中一个重要的性能调整技术。索引的创建可以提高SQL语句的执行速度,但是它对已经在执行中的SQL语句不会产生影响。下面我们将详细讨论创建索引对SQL语句执行的影响。 一、...