SQL Server和Oracle中的索引(一)

日期: 2008-08-04 作者:王铁民 来源:TechTarget中国 英文

本文介绍了SQL Server和Oracle的索引及常见的索引类型,希望通过比较的方法,加深对二种数据库索引应用的理解。


1 SQL Server中的索引


索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B树)中,使SQL Server可以快速有效地查找与键值关联的行。


表或视图可以包含以下类型的索引:


聚集索引


聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。


只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。


每个表几乎都对列定义聚集索引来实现下列功能:


1、可用于经常使用的查询。
  2、提供高度唯一性。


在创建聚集索引之前,应先了解数据是如何被访问的。考虑对具有以下特点的查询使用聚集索引:


使用运算符(如BETWEEN、>、>=、< 和 <=)返回一系列值。


使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行物理相邻。例如,如果某个查询在一系列采购订单号间检索记录,PurchaseOrderNumber列的聚集索引可快速定位包含起始采购订单号的行,然后检索表中所有连续的行,直到检索到最后的采购订单号。


返回大型结果集。


使用join子句;一般情况下,使用该子句的是外键列。


使用ORDER BY或GROUP BY子句。


在ORDER BY或GROUP BY子句中指定的列的索引,可以使数据库引擎 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。


聚集索引不适用于具有下列属性的列:


频繁更改的列


这将导致整行移动,因为数据库引擎 必须按物理顺序保留行中的数据值。这一点要特别注意,因为在大容量事务处理系统中数据通常是可变的。


宽键


宽键是若干列或若干大型列的组合。所有非聚集索引将聚集索引中的键值用作查找键。为同一表定义的任何非聚集索引都将增大许多,这是因为非聚集索引项包含聚集键,同时也包含为此非聚集索引定义的键列。



  非聚集索引


非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。


从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。
 
在SQL Server 2005中,可以向非聚集索引的叶级别添加非键列以跳过现有的索引键限制(900字节和16键列),并执行完整范围内的索引查询。


非聚集索引与聚集索引具有相同的B树结构,它们之间的显著差别在于以下两点:


1、基础表的数据行不按非聚集键的顺序排序和存储。


2、非聚集索引的叶层是由索引页而不是由数据页组成。


设计非聚集索引时需要注意数据库的特征:


更新要求较低但包含大量数据的数据库或表可以从许多非聚集索引中获益从而改善查询性能。


决策支持系统应用程序和主要包含只读数据的数据库可以从许多非聚集索引中获益。查询优化器具有更多可供选择的索引用来确定最快的访问方法,并且数据库的低更新特征意味着索引维护不会降低性能。


联机事务处理应用程序和包含大量更新表的数据库应避免使用过多的索引。此外,索引应该是窄的,即列越少越好。


一个表如果建有大量索引会影响 insert、update和delete语句的性能,因为所有索引都必须随表中数据的更改进行相应的调整。



  唯一索引


唯一索引确保索引键不包含重复的值,因此,表或视图中的每一行在某种程度上是唯一的。


聚集索引和非聚集索引都可以是唯一索引。


包含性列索引


一种非聚集索引,它扩展后不仅包含键列,还包含非键列。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐