- 浏览: 613038 次
- 性别:
- 来自: 太原
文章分类
- 全部博客 (240)
- 程序员数学/线性代数(Linear Algebra) (2)
- 程序员数学/微积分(Calculus) (6)
- 机器学习(Machine Learning) (5)
- JAVA SE (63)
- JAVA EE (14)
- 数据库技术 (26)
- struts (4)
- 软件设计/设计模式 (0)
- ibatis (2)
- XML (4)
- 领域建模 (0)
- 数据资源共享 (1)
- 软件工程 (11)
- 技术以外 (6)
- 面向对象 (2)
- 科学数据共享 (1)
- 资源 (7)
- WEB2.0 (11)
- 电子商务 (10)
- 算法、数据结构、数学 (10)
- LAMP (1)
- 杂谈 (12)
- C语言 (7)
- 程序设计思想 (3)
- 读书和笔记 (1)
- 生活 健身 养生 (5)
- WEB UI (2)
- eclipse (2)
- 项目管理 (7)
- oracle (5)
- linux (1)
- webGIS (6)
最新评论
-
TimePower:
OK~终于明白了~~
参数(parameter)和属性(Attribute)的区别 -
OnTheRoad_lee:
不错,正式我想要的东西,一直不明白序列化是什么?有什么用?至此 ...
我对Java Serializable(序列化)的理解和总结 -
EchoZhouYou:
好久不上这,找这本书时发现这一篇,特意登录来赞一下
《程序设计语言——实践之路》读后感 -
yong7356:
学习一下Serializable
我对Java Serializable(序列化)的理解和总结 -
dengjm_2012:
写得不错!
我对Java Serializable(序列化)的理解和总结
摘 要:索引是影响关系数据库(RDBMS)性能的重要因素之一。当今常用的关系数据库,如SQL Server、Sybase、Oracle、DB2等,为了提高性能,都提供相应的索引机制。本文以微软的SQL Server数据库为例,介绍索引的概念、使用方法以及日常维护。
关键词:数据库、索引、检索
1 索引的概念
索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。表的存储由两部分组成,一部分用来存放数据页面,另一部分存放索引页面。通常,索引页面相对于数据页面来说小得多。数据检索花费的大部分开销是磁盘读写,没有索引就需要从磁盘上读表的每一个数据页,如果有索引,则只需查找索引页面就可以了。所以建立合理的索引,就能加速数据的检索过程。
SQL Server采用B-树结构的索引,根据索引的顺序与数据表的物理顺序是否相同可以分为:聚簇索引(clustered index)和非聚簇索引(nonclustered index)。
(1)聚簇索引重新组织表中的数据以按指定的一个或多个列的值排序。聚簇索引的叶节点包含实际的数据,因此用它查找数据很快,但每个表只能建一个聚簇索引。
(2)非聚簇索引不重新组织表中的数据,它的叶节点中存储了组成非聚簇索引的列的值和行定位指针。一个表可以建249 个非聚簇索引。
通俗的说,汉语字典的正文就是一个建立在拼音基础上的聚簇索引,以英文字母“a”开头并以“z”结尾。比如,我们要查“阿”字,就会翻开字典的第一页,因为“阿”的拼音是“a”,所以排在字典的前面。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明字典中没有这个字。同样的,如果查“做”字,就会把字典翻到最后。
字典的“偏旁部首”是非聚簇索引。比如我们要查“阿”字,在查部首之后,看到部首检字表中“阿”的页码是1页,“阿”的上面是“际”字,但页码却是277页,“阿”的下面是“陇”字,页码是416页。很显然,这些字并不是真正的分别位于“阿”字的上下方,现在看到的连续的“际、阿、陇”三字实际上就是他们在非聚簇索引中的排序,是字典正文中的字在非聚簇索引中的映射。
2 索引的使用
1)聚簇索引的使用
在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、& gt;、>=)或使用group by、order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行必然连在一起,不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。
聚簇索引的侯选列是:
u 经常按范围存取的列,如date>”20050101” and date< “20050131”;
u 经常在where子句中使用并且插入是随机的主键列;
u 在group by或order by中使用的列;
u 在连接操作中使用的列。
2)非聚簇索引的使用
由于非聚簇索引的叶级点不包含实际的数据,因此它检索效率较低,但一个表只能建一个聚簇索引,当用户需要建立多个索引时就需要使用非聚簇索引了。在建立非聚簇索引时,要权衡索引对查询速度的加快与降低修改速度之间的利弊。
在下面情况中使用非聚簇索引:
u 常用于集合函数(如Sum,....)的列;
u 常用于join, order by, group by的列;
u 查寻出的数据不超过表中数据量的20%。
表1 索引使用情况分析表
情况描述 使用聚簇索引 使用非聚簇索引
用于返回某范围内数据的列 应 不应
经常被用作分组排序的列 应 应
小数目不同值的列 应 不应
连接操作使用的列 应 应
频繁更新、修改的列 不应 应
一个或极少不同值的列 不应 不应
大数目不同值的列 不应 应
3)创建索引需要注意的要点
1) 慎重选择作为聚簇索引的列
默认情况下,SQL Server用主键创建聚簇索引。这种做法常常造成聚簇索引的浪费。通常,我们会为每个表建立一个ID列,以区分每条数据,并且该列是自动增大的,步长一般为1。如果我们把这个列设为主键,SQL Server会将此列默认为聚簇索引。这样做可以使数据在数据库中按ID进行物理排序,但这种做法在实际应用中意义并不大。根据前面谈到的聚簇索引的定义和使用情况可以看出,使用聚簇索引的最大好处就是能够根据查询要求,迅速返回某个范围内的数据,避免全表扫描。在实际应用中,因为ID号是自动生成的,我们并不知道每条记录的ID号,所以我们不太可能用ID号来进行查询。这就使聚簇索引成为摆设,造成资源浪费。其次,让每个值都不同的ID列作为聚簇索引也不符合“大数目的不同值情况下不应建立聚簇索引”规则。
一般情况下,数据库应用系统进行数据检索都离不开“ 用户名(代码)”、“日期”字段。以笔者所用的HIS系统(医院管理信息系统)为例,我们进行费用、处方、检查单等信息检索时需要根据“住院号”和“日期 ”这两个字段来返回特定范围内的数据。下面我们分几种情况观察在不同索引条件下查询相同内容所用的时间。
假设病人费用表名为“brfy”,其中住院号字段名为“zyh”,日期字段名为“riqi”,要求是从表brfy中检索zyh为“028246”的病人2005年3月1日到20日的费用,对应的SQL语句如下:
Select * from brfy where zyh=’028246’ and riqi>=’20050301’ and riqi<=’20050320’;
第一种情况,用ID列建立聚簇索引,不为zyh和riqi建立索引,查询时间为87秒。
第二种情况,用ID列建立聚簇索引,为zyh和riqi两列建立非聚簇索引(zyh在前),查询时间为33秒。
第三种情况,用zyh和riqi两列建立聚簇索引(zyh在前),查询时间为2秒。
由以上分析可以看出聚簇索引是非常宝贵的,应该为经常用于检索某个范围内数据的列或group by、order by等子句的列建立聚簇索引,这样能够极大的提高系统性能。
2) 重视以多个列创建的索引中列的顺序问题
一些用户认为只要合理的选择列建立索引,不必关心列的顺序就可以提高检索速度,这种观点是错误的。多列索引中列的先后顺序应该和实际应用中 where、group by或order by等子句里列的放置位置相同。参考上面举的例子,在第二、第三种情况下,如果把riqi放在zyh前面,执行上述SQL语句就不会用到这两个索引,检索的时间也会变得很长。
3 索引的维护
数据库系统运行一段时间后,随着数据行的插入、删除和数据页的分裂,索引对系统的优化性能就会大大降低。这时候,我们需要对索引进行分析和重建。
SQL Server使用DBCC SHOWCONTIG确定是否需要重建表的索引。在 SQL Server的查询分析器中输入命令:
Use database_name
Declare @table_id int
Set @table_id=object_id ('Employee')
Dbcc showcontig (@table_id)
在命令返回的参数中Scan Density 是索引性能的关键指示器,这个值越接近100%越好,一般在低于90%的情况下,就需要重建索引。重建索引可以使用DBCC DBREINDEX,使用方式如下:
dbcc dbreindex('表名', 索引名, 填充因子) /*填充因子一般为90或100*/
如果重建后,Scan Density还没有达到100%,可以重建该表的所有索引:
dbcc dbreindex('表名', '', 填充因子)
在良好的数据库设计基础上,有效地使用索引是数据库应用系统取得高性能的基础。然而,任何事物都具有两面性,索引也不例外。索引的建立需要占用额外的存储空间,并且在增、删、改操作中也会增加一定的工作量,因此,在适当的地方增加适当的索引并从不合理的地方删除次要的索引,将有助于优化那些性能较差的数据库应用系统。实践表明,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生最佳的优化方案
关键词:数据库、索引、检索
1 索引的概念
索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。表的存储由两部分组成,一部分用来存放数据页面,另一部分存放索引页面。通常,索引页面相对于数据页面来说小得多。数据检索花费的大部分开销是磁盘读写,没有索引就需要从磁盘上读表的每一个数据页,如果有索引,则只需查找索引页面就可以了。所以建立合理的索引,就能加速数据的检索过程。
SQL Server采用B-树结构的索引,根据索引的顺序与数据表的物理顺序是否相同可以分为:聚簇索引(clustered index)和非聚簇索引(nonclustered index)。
(1)聚簇索引重新组织表中的数据以按指定的一个或多个列的值排序。聚簇索引的叶节点包含实际的数据,因此用它查找数据很快,但每个表只能建一个聚簇索引。
(2)非聚簇索引不重新组织表中的数据,它的叶节点中存储了组成非聚簇索引的列的值和行定位指针。一个表可以建249 个非聚簇索引。
通俗的说,汉语字典的正文就是一个建立在拼音基础上的聚簇索引,以英文字母“a”开头并以“z”结尾。比如,我们要查“阿”字,就会翻开字典的第一页,因为“阿”的拼音是“a”,所以排在字典的前面。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明字典中没有这个字。同样的,如果查“做”字,就会把字典翻到最后。
字典的“偏旁部首”是非聚簇索引。比如我们要查“阿”字,在查部首之后,看到部首检字表中“阿”的页码是1页,“阿”的上面是“际”字,但页码却是277页,“阿”的下面是“陇”字,页码是416页。很显然,这些字并不是真正的分别位于“阿”字的上下方,现在看到的连续的“际、阿、陇”三字实际上就是他们在非聚簇索引中的排序,是字典正文中的字在非聚簇索引中的映射。
2 索引的使用
1)聚簇索引的使用
在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、& gt;、>=)或使用group by、order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行必然连在一起,不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。
聚簇索引的侯选列是:
u 经常按范围存取的列,如date>”20050101” and date< “20050131”;
u 经常在where子句中使用并且插入是随机的主键列;
u 在group by或order by中使用的列;
u 在连接操作中使用的列。
2)非聚簇索引的使用
由于非聚簇索引的叶级点不包含实际的数据,因此它检索效率较低,但一个表只能建一个聚簇索引,当用户需要建立多个索引时就需要使用非聚簇索引了。在建立非聚簇索引时,要权衡索引对查询速度的加快与降低修改速度之间的利弊。
在下面情况中使用非聚簇索引:
u 常用于集合函数(如Sum,....)的列;
u 常用于join, order by, group by的列;
u 查寻出的数据不超过表中数据量的20%。
表1 索引使用情况分析表
情况描述 使用聚簇索引 使用非聚簇索引
用于返回某范围内数据的列 应 不应
经常被用作分组排序的列 应 应
小数目不同值的列 应 不应
连接操作使用的列 应 应
频繁更新、修改的列 不应 应
一个或极少不同值的列 不应 不应
大数目不同值的列 不应 应
3)创建索引需要注意的要点
1) 慎重选择作为聚簇索引的列
默认情况下,SQL Server用主键创建聚簇索引。这种做法常常造成聚簇索引的浪费。通常,我们会为每个表建立一个ID列,以区分每条数据,并且该列是自动增大的,步长一般为1。如果我们把这个列设为主键,SQL Server会将此列默认为聚簇索引。这样做可以使数据在数据库中按ID进行物理排序,但这种做法在实际应用中意义并不大。根据前面谈到的聚簇索引的定义和使用情况可以看出,使用聚簇索引的最大好处就是能够根据查询要求,迅速返回某个范围内的数据,避免全表扫描。在实际应用中,因为ID号是自动生成的,我们并不知道每条记录的ID号,所以我们不太可能用ID号来进行查询。这就使聚簇索引成为摆设,造成资源浪费。其次,让每个值都不同的ID列作为聚簇索引也不符合“大数目的不同值情况下不应建立聚簇索引”规则。
一般情况下,数据库应用系统进行数据检索都离不开“ 用户名(代码)”、“日期”字段。以笔者所用的HIS系统(医院管理信息系统)为例,我们进行费用、处方、检查单等信息检索时需要根据“住院号”和“日期 ”这两个字段来返回特定范围内的数据。下面我们分几种情况观察在不同索引条件下查询相同内容所用的时间。
假设病人费用表名为“brfy”,其中住院号字段名为“zyh”,日期字段名为“riqi”,要求是从表brfy中检索zyh为“028246”的病人2005年3月1日到20日的费用,对应的SQL语句如下:
Select * from brfy where zyh=’028246’ and riqi>=’20050301’ and riqi<=’20050320’;
第一种情况,用ID列建立聚簇索引,不为zyh和riqi建立索引,查询时间为87秒。
第二种情况,用ID列建立聚簇索引,为zyh和riqi两列建立非聚簇索引(zyh在前),查询时间为33秒。
第三种情况,用zyh和riqi两列建立聚簇索引(zyh在前),查询时间为2秒。
由以上分析可以看出聚簇索引是非常宝贵的,应该为经常用于检索某个范围内数据的列或group by、order by等子句的列建立聚簇索引,这样能够极大的提高系统性能。
2) 重视以多个列创建的索引中列的顺序问题
一些用户认为只要合理的选择列建立索引,不必关心列的顺序就可以提高检索速度,这种观点是错误的。多列索引中列的先后顺序应该和实际应用中 where、group by或order by等子句里列的放置位置相同。参考上面举的例子,在第二、第三种情况下,如果把riqi放在zyh前面,执行上述SQL语句就不会用到这两个索引,检索的时间也会变得很长。
3 索引的维护
数据库系统运行一段时间后,随着数据行的插入、删除和数据页的分裂,索引对系统的优化性能就会大大降低。这时候,我们需要对索引进行分析和重建。
SQL Server使用DBCC SHOWCONTIG确定是否需要重建表的索引。在 SQL Server的查询分析器中输入命令:
Use database_name
Declare @table_id int
Set @table_id=object_id ('Employee')
Dbcc showcontig (@table_id)
在命令返回的参数中Scan Density 是索引性能的关键指示器,这个值越接近100%越好,一般在低于90%的情况下,就需要重建索引。重建索引可以使用DBCC DBREINDEX,使用方式如下:
dbcc dbreindex('表名', 索引名, 填充因子) /*填充因子一般为90或100*/
如果重建后,Scan Density还没有达到100%,可以重建该表的所有索引:
dbcc dbreindex('表名', '', 填充因子)
在良好的数据库设计基础上,有效地使用索引是数据库应用系统取得高性能的基础。然而,任何事物都具有两面性,索引也不例外。索引的建立需要占用额外的存储空间,并且在增、删、改操作中也会增加一定的工作量,因此,在适当的地方增加适当的索引并从不合理的地方删除次要的索引,将有助于优化那些性能较差的数据库应用系统。实践表明,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生最佳的优化方案
发表评论
-
百万级数据查询优化
2011-03-07 14:12 14471.对查询进行优化,应尽量避免全表扫描,首先应考虑在 whe ... -
死锁反反复复反反复复方法
2010-05-20 14:24 0其实所有的死锁最深层的原因就是一个:资源竞争 表现一: ... -
索引总结
2010-04-13 13:57 1419提高SQL Server性能最重要的方面之一就是提供正确的索引 ... -
选择索引:查询VS 修改性能
2010-04-13 13:55 1867I/O是决定查询性能的主 ... -
视图索引(Indexed Views)
2010-04-13 13:50 2264正如第27章所讲的那样 ... -
评价索引的有效性(Evaluating Index Usefulness)
2010-04-13 13:39 1969SQL Server提供索引主要有两个原因:其一是作为一种保证 ... -
索引和性能
2010-04-13 13:23 1399主要内容包括: 索引使用标准(Index Usage Cri ... -
SQL Server中三种查找数据方法的比较
2010-04-13 13:18 2449在SQL Server中主要有有三种方式可以查找数据,分别是: ... -
SQL Server性能调优指南
2010-04-13 09:48 2618经过几个月断断续续,比较系统学习,终于对数据库优化中所涉及到的 ... -
数据库性能调优概观
2010-04-11 19:24 2106一般而言,影响数据整体性能的因素如图所示。 若数据库设 ... -
最近需要掌握技术
2010-03-01 17:30 01、左右内全连接查询性能方面的比较 2、视图与连接查询时的性能 ... -
索引介绍
2010-01-04 06:50 0SQL Server : Nested transaction ... -
索引统计(Index Statistics)
2009-12-03 10:56 2002正如前面提到的,键的选择性是决定当执行一个查询时是否使用索引的 ... -
索引设计指南( Index Design Guidelines)
2009-12-02 16:51 1484SQL Server的索引对用户和T-SQL开发者来说几乎是透 ... -
评价索引的有效性(Evaluating Index Usefulness)
2009-10-29 15:29 1149SQL Server提供索引主要有两个原因:其一是作为一种实施 ... -
索引的选择(Index Selection)
2009-10-29 13:56 1157当决定在表中创建哪些索引时要对应用中查询进行仔细分析。具体包括 ... -
索引使用标准(Index Usage Criteria)
2009-10-27 17:13 1712索引使用标准(Index Usage Criteria) ... -
索引和性能(Indexs and Performance)
2009-10-27 15:24 1150索引和性能(Indexs and Pe ... -
SQL Server 2000索引实现内幕
2009-10-19 16:58 1619翻译自:Microsoft SQL Server 2000 U ... -
SQL Server迁移到ORACLE相关资料收集
2009-10-12 11:16 01|、http://blog.163.com/shenlian ...
相关推荐
### 空间数据库索引技术的深度剖析 #### 核心知识点提炼: - **空间数据库索引技术的重要性**:空间数据库索引技术是提升空间数据库存储效率与空间检索性能的关键,尤其在处理大规模空间数据时更为显著。传统索引...
数据库索引技术是数据库管理系统中的核心组成部分,它极大地提高了数据查询效率,使得在海量数据中查找特定信息变得迅速。下面将分别对标题和描述中提到的各个知识点进行详细阐述。 首先,我们来看“文件记录的组织...
关系数据库的实现之数据库索引技术 数据库索引技术是关系数据库系统实现的重要组件之一。它能够帮助我们快速地检索到满足指定条件的记录,从而提高数据库系统的性能。这篇文章将介绍数据库索引技术的基础知识,包括...
本文深入探讨了空间数据库索引技术的重要性及其最新进展,特别关注了四种广为采用的空间索引方法:R树、K-D树、Quad树和GiST。 #### 一、空间数据库的特点及挑战 空间数据库存储和管理具有空间属性的数据,如地理...
空间数据库索引技术是数据库领域中的重要分支,特别是在地理信息系统(GIS)、遥感、城市规划等领域,它对于处理和检索海量的多维空间数据至关重要。空间数据库不仅包含传统的属性数据,还涉及到地理位置和空间关系...
本文讨论的是一种基于历史关系数据库管理系统的新型时态索引技术,其设计目的是满足特定的时空需求,并针对时态数据库的特征进行改进和优化。该技术的应用能够显著提高时态查询的效率,适用于各种时态数据操作。下面...
【空间、时序、时空数据库索引技术的分析】 索引技术在数据库系统中起着至关重要的作用,尤其是在处理大量数据时,它能够提高查询效率,确保数据的快速定位。随着大数据时代的发展,数据库技术从关系数据库扩展到了...
综上所述,数据库索引设计与优化是数据库管理中的关键技术,理解和掌握这些知识,能有效提升系统的响应速度,为业务发展提供强大支持。在实践中,应结合具体场景,灵活运用各种索引策略,以实现最佳的性能表现。
传统上,虚拟数据分布重组数据库索引技术被广泛应用于网络文本数据库的索引优化。该技术通过虚拟数据的分布重组,以及查询扩展和信息融合,对信息检索进行优化。然而,它并不总能保证聚类特征的一致性,从而影响了...
4. **关系数据库理论**:理解关系代数、关系演算和SQL语言,它们是查询和操作关系数据库的基础。 5. **数据库设计**:掌握数据库的逻辑设计和物理设计,包括范式理论(1NF、2NF、3NF、BCNF等),以及数据库的规范化...
数据库应用技术是信息技术领域中的核心组成部分,它涉及数据的存储、组织、检索和管理。这份资料"数据库应用技术 题和答案"显然是为学习者提供了深入理解和掌握数据库原理及实践操作的机会。以下是对该主题的详细...
与关系型数据库类似,MongoDB中的索引可以帮助快速定位数据,特别是在有大量数据的集合中。索引可以包括一个或多个字段,并可以指定是升序(1)还是降序(-1)。MongoDB支持多种索引类型,包括单字段索引、复合索引...
总之,数据库索引设计与优化是一门涉及理论与实践的综合技术,需要结合业务需求、数据分布、查询模式等多个因素,才能实现数据库性能的最大化。通过阅读"数据库索引设计与优化-高清版.pdf"这本书,读者可以深入理解...
关系数据库是数据存储和管理的核心工具,广泛应用于各种信息系统中。这个"关系数据库案例.rar"压缩包文件似乎包含了关于实际应用关系数据库的一些示例或教程资料。以下是对关系数据库及其重要概念的详细解释: 关系...
因此,正确使用数据库索引技术对于优化数据库性能至关重要。 2. 索引的分类 2.1 B树索引 B树索引是最常见的索引类型,基于二叉树原理,分支块相当于大目录,页块则指向具体的记录,确保了快速的数据访问。默认情况...
标题中的“Native-XML数据库索引及查询处理”是指一种专门针对XML文档的数据库管理系统,这类数据库以XML格式原生地存储和管理数据,而不仅仅是将XML作为一种数据交换格式。XML(eXtensible Markup Language)是一种...
从含义与优势方面探讨了关系数据库语言SQL概况,论述了基于关系数据库SQL的查询方法,提出了基于关系数据库SQL的优化技术:更新系统统计信息、优化系统产品设计、合理使用系统索引、避免或简化排序、使用存储过程、改进...
关系数据库技术是现代计算机网络设计的核心组成部分,它在数据存储、管理和检索方面起着至关重要的作用。关系数据库技术基于关系模型,将数据组织成表格形式,通过行和列的结构来表示实体及其相互关系,使得数据操作...
索引的设计是关系数据库设计的重要方面,主要包括索引的类型、索引的设计原则、索引的优缺点等。 物理设计 物理设计是关系数据库设计的最后阶段,主要包括物理存储的设计、数据存储的设计、数据库性能的优化等。 ...
数据库应用技术是计算机科学领域的重要组成部分,主要关注如何有效地存储、管理和检索数据。这门课程通常在学生对数据库原理有初步理解后进行教授,旨在将理论知识转化为实践技能。以下是对压缩包文件中各部分内容的...