VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > sql数据库 >
  • sql语句大全之索引类型

索引类型
SQL Server有3种类型的索引,即聚集索引、非聚集索引,以及主XML索引和辅助XML索引。但是在本书中,我们主要介绍聚集索引和非聚集索引,因为XML和XML索引是一个更高级的话题。
索引的类型是指在SQL Server中存储索引和数据的物理行的方式。理解索引类型之间的不同是很重要的,我们在下面进行说明。
1. 聚集索引
聚集索引定义了数据在表中存储的物理顺序。如果在聚集索引中定义了不止一个列,数据将按照在这些列上所指定的顺序来存储,先按第一列指定的顺序,再按第二列指定的顺序,依此类推。一个表只能定义一个聚集索引。它不可能采用两种不同的物理顺序来存储数据。
回到本书先前的类比,如果查看一个电话簿,你会看到数据先以姓氏的字母顺序排列,再以名的字母顺序排列,再以中间名的字母顺序排列。因此,当搜索索引并找到键的时候,就已经从要提取的信息中找到了相应的数据,如电话号码。换句话说,这时并不需要根据相应的键,再翻到相应的页,来找到数据,数据本身就已经在这里了。这就是针对姓、名和中间名的聚集索引。
在数据被插入时,SQL Server会将输入的数据,连同索引键值,一同插入到合适位置对应的行中。然后会移动数据,以便保持顺序。可以将数据想象成书架中的书。在图书馆购进一本新书时,管理员会尝试按字母顺序找到一个位置,并将这本书插入到该位置中。这时书架上所有的书都会被移动。如果此时没有足够的空间供图书移动,那么在书架最后位置上的书就会被移动到下一个书架上,依此类推。直到书架上有足够的位置供新书加入。尽管这种移动看上去非常简单,但这的确就是SQL Server所做的事情。
不要将聚集索引放置到一个会进行大量更新的列上,因为这意味着SQL Server会不得不经常改变数据的物理位置,这样会导致过多的处理开销。
由于在聚集索引中包含了表数据本身,与通过非聚集索引提取数据相比,使用聚集索引提取数据时,SQL Server需要进行的I/O操作更少。因此,如果在表中只有一个索引,那么应该确保它是聚集索引。
2. 非聚集索引
不像聚集索引,非聚集索引并不存储表数据本身。相反,非聚集索引只存储指向表数据的指针,该指针作为索引键的一部分,因此,在一个表中同时可以存在多个非聚集索引。
因为非聚集索引以与基表分开的结构保存(实际上,是以带有聚集索引的表的形式保存,只不过被隐藏起来而无法看见),所以可以在与基表不同的文件组中创建非聚集索引。如果文件组被保存在不同的磁盘上,在查询和提取数据时可以得到性能上的提升,这是因为SQL Server可以进行并行的I/O操作,从索引和基表中同时提取数据。
在从拥有非聚集索引的表中提取信息的时候,SQL Server会在索引中找到相关的行。如果要查询的信息不是索引中所记录信息的一部分,SQL Server会再使用索引指针中的信息,以提取数据中的相关行。正如你看到的,这至少需要两个I/O操作--也可能更多,这依赖于对索引的优化。
在创建非聚集索引时,用来创建索引的信息与表分开放置在不同的位置,因而可以在需要时将其存储在不同的物理磁盘上。
注意 索引越多,在往带有索引的行中插入或更新数据时,SQL Server进行索引修改操作所花费的时间就越多。
3. XML索引和辅助XML索引
关于对XML数据进行索引,在本书中只进行简要介绍。要了解更多这方面的知识,最好去阅读联机丛书,因为该主题超出了本书的范围。
【责任编辑:云霞 TEL:(010)68476606】
 
6.1.2 唯一性
http://book.51cto.com  2009-05-15 11:25  董明等译  人民邮电出版社  我要评论()
·         摘要:《SQL Server 2008基础教程》第1章SQL Server 2008概述和安装,本章介绍了SQL Server中的安全性,使读者能轻松地知晓自己想要以何种方式实现安全性,以及如何处理不同的用户名。本节为大家介绍唯一性。
·         标签:索引  SQL Server  SQL Server 2008基础教程
·          
限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne和甲骨文开发者大会2010”
6.1.2  唯一性
索引可以被定义为唯一的或非唯一的。唯一索引确保带有唯一索引的列中所保存的值,包括NULL值,在整个表中只能出现一次。
SQL Server会自动对带有唯一索引的列强制其唯一性。如果试图在表中插入一个已经存在的值,就会产生错误,对数据的插入或修改就会失败。
非唯一索引很有效。然而,因为它允许出现重复的值,所以在提取数据的时候,非唯一索引会比唯一索引带来更大的开销。SQL Server需要检查是否返回了多个项,并同SQL Server所知道的唯一索引进行比较,以便在找到第一个行之后停止搜索。
实现唯一索引通常用于支持约束,例如对主键的约束。实现非唯一索引通常用于支持使用非键列的行的定位。
【责任编辑:云霞 TEL:(010)68476606】
 
6.2.1 使用低维护列
http://book.51cto.com  2009-05-15 11:25  董明等译  人民邮电出版社  我要评论()
·         摘要:《SQL Server 2008基础教程》第6章创建索引和数据库关系图,本章介绍了数据库关系图。数据库关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍使用低维护列。
·         标签:索引  SQL Server  SQL Server 2008基础教程
·          
限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne和甲骨文开发者大会2010”
6.2  确定是什么创建了好的索引
要在表中创建索引,应该指定在索引中要包含哪些列。索引中的列不需要都是相同的数据类型。你应该了解,一个索引中最多只能包含16个列,在一行中,索引列中总共包含的数据不能多于900字节。老实说,如果你创建的索引中包含的列数超过了4或5列,就应该回头重新评估一下索引定义。有时候你的确需要在索引中包含超过5列,即便如此也确实应该再次对此进行检查。
也可以摆脱这一限制,创建一个包含不属于键的列的索引:该列被标记到索引的最后。这意味着索引会占用更多的空间,但也意味着若SQL Server从索引搜索中提取所有的数据,则会比较快捷。然而,要重申的是,如果要按这种方式设计索引,那么也许应该看看索引的设计是否合理。
在下面的几节中,我们将对一些要素进行检查,以确定索引是否是好的索引:
使用"低维护"列;
使用主键和外键;
能够找到指定的记录;
使用覆盖索引;
查找信息范围;
保持数据的排序。
6.2.1  使用低维护列
正如我提到过的,对于非聚集索引来说,真正的索引数据同表数据是分开的,尽管二者可以被存储到同一区域或不同区域(例如,保存在不同的硬盘驱动器上)。要重申的是,这意味着在往表中插入记录的时候,索引中包含的列中的信息被复制,并被插入到索引区域中。因此,如果在表中对一个列里的数据进行修改,而该列被包含在一个索引中,则SQL Server也必须对索引中的数据进行修改。也就是说,实际上并不只是进行了一次更新,而是两次更新。如果表拥有不止一个索引,那么也就更新不止一次,这样在对一条记录进行修改时,可能会导致几次磁盘写操作。在对数据的修改操作中,这可能会导致性能的下降,在创建索引时,应该在这种性能的下降与在数据提取方面的性能提升之间找到一个平衡点。
因此,对于低维护的数据(其含义是更新频度不高的列)来说,可以在其上创建索引,而且这会是好的索引。这样SQL Server只需进行更少的磁盘写入,也可以获得更快的数据库性能。在SQL Server数据库实例中的其他数据库也是如此。然而,不要让这种规则束缚了你。如果你认为在数据库中,提取数据比修改数据更频繁,或提取数据的性能比修改数据的性能更重要,那么就可以考虑在索引中包含这些列。
在我们构建的样例应用程序中,每个月都需要用收入或支出来更新客户的银行结余。然而,我们还需要每晚进行一项工作,就是找出存款在10 000美元和50 000美元之间的客户,因为按照美国联邦储备的规定,银行会给这些客户一个更高的储蓄利率。客户的银行结余会被频繁更新,而位于这些列上的索引会加速晚间的储蓄检查程序。在本例的索引被创建之前,我们需要确定在提升检查程序的性能的同时,更新结余的过程中轻微的性能下降是否可被接受。
【责任编辑:云霞 TEL:(010)68476606】
6.2.2 主键和外键
http://book.51cto.com  2009-05-15 11:25  董明等译  人民邮电出版社  我要评论()
·         摘要:《SQL Server 2008基础教程》第6章创建索引和数据库关系图,本章介绍了数据库关系图。数据库关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍主键和外键。
·         标签:索引  SQL Server  SQL Server 2008基础教程
·          
限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne和甲骨文开发者大会2010”
6.2.2  主键和外键
索引的一种重要用途是在表中设置引用约束。请回忆第3章,引用约束是通过对键的使用,根据现存的数据,对某些操作进行约束的行为。一个关于引用约束的快速示例:假设你有一个拥有自己的银行产品的客户。引用约束可以防止在该客户的银行产品还存在的时候删除该客户。
SQL Server不会针对外键自动创建索引。然而,因为在连接到父表的时候,外键列值需要被SQL Server所标识,所以通常总是建议在外键列上创建索引。
【责任编辑:云霞 TEL:(010)68476606】
 
6.2.3 找到指定记录
http://book.51cto.com  2009-05-15 11:25  董明等译  人民邮电出版社  我要评论()
·         摘要:《SQL Server 2008基础教程》第6章创建索引和数据库关系图,本章介绍了数据库关系图。数据库关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍找到指定记录。
·         标签:索引  SQL Server  SQL Server 2008基础教程
·          
限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne和甲骨文开发者大会2010”
6.2.3  找到指定记录
对于索引来说,理想的情况是让列允许SQL Server快速标识出合适的行。在第8章,我们会遇到WHERE查询子句。该子句列出了表中的某些列,并用于限制在一个查询中所返回的行数。在最常用的查询中,WHERE子句中使用的列是索引的最佳选择。例如,如果需要通过特定的订单号找到客户的订单,那么基于customer_id和order_number来创建索引是比较好的选择,因为在表中,所有用于定位所需行的信息都会包含在索引中。
如果在应用程序中找到指定的记录是其工作的一部分,那么这种场景确实是一个应该考虑创建索引的地方。
【责任编辑:云霞 TEL:(010)68476606】
 
回书目   上一节   下一节
 
上一篇: 6.2.2 主键和外键 下一篇: 6.2.4 使用覆盖索引
6.2.4 使用覆盖索引
http://book.51cto.com  2009-05-15 11:25  董明等译  人民邮电出版社  我要评论()
·         摘要:《SQL Server 2008基础教程》第6章创建索引和数据库关系图,本章介绍了数据库关系图。数据库关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍使用覆盖索引。
·         标签:索引  SQL Server  SQL Server 2008基础教程
·          
限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne和甲骨文开发者大会2010”
6.2.4  使用覆盖索引
正如早先提到的,在插入和更新记录时,索引中包含的列中的数据,不仅会被保存到表中,也会保存在非聚集索引中。通过在索引中找到一个项,SQL Server会转移到表中,以定位和提取记录。然而,如果所需的信息已经被保存在索引中,那么就不需要进入到表中来提取记录,因此这可以提供更快的数据访问。
例如,考虑一下ApressFinancial数据库中的ShareDetails.Shares表。假设你需要在其中找到描述信息、当前价格及股票的股票行情自动收录器ID。如果索引被放置在ShareId列上,这是一个标识列,因此是唯一的,你会请求SQL Server使用提供的ID来找到该记录。然后会从该索引中得到该数据定位的详细信息,并移动到该数据区域。然而,如果有一个索引中包含了所有的列,那么SQL Server就可以在索引操作中提取描述股票行情自动收录器和价格的细节,而不再需要移动到数据区域。这被称作覆盖索引(covered index),因为索引覆盖了表中的每一列,以方便数据的提取。
6.2.4 使用覆盖索引
http://book.51cto.com  2009-05-15 11:25  董明等译  人民邮电出版社  我要评论()
·         摘要:《SQL Server 2008基础教程》第6章创建索引和数据库关系图,本章介绍了数据库关系图。数据库关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍使用覆盖索引。
·         标签:索引  SQL Server  SQL Server 2008基础教程
·          
限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne和甲骨文开发者大会2010”
6.2.4  使用覆盖索引
正如早先提到的,在插入和更新记录时,索引中包含的列中的数据,不仅会被保存到表中,也会保存在非聚集索引中。通过在索引中找到一个项,SQL Server会转移到表中,以定位和提取记录。然而,如果所需的信息已经被保存在索引中,那么就不需要进入到表中来提取记录,因此这可以提供更快的数据访问。
例如,考虑一下ApressFinancial数据库中的ShareDetails.Shares表。假设你需要在其中找到描述信息、当前价格及股票的股票行情自动收录器ID。如果索引被放置在ShareId列上,这是一个标识列,因此是唯一的,你会请求SQL Server使用提供的ID来找到该记录。然后会从该索引中得到该数据定位的详细信息,并移动到该数据区域。然而,如果有一个索引中包含了所有的列,那么SQL Server就可以在索引操作中提取描述股票行情自动收录器和价格的细节,而不再需要移动到数据区域。这被称作覆盖索引(covered index),因为索引覆盖了表中的每一列,以方便数据的提取。
6.2.6 保持数据的排序
http://book.51cto.com  2009-05-15 11:52  董明等译  人民邮电出版社  我要评论()
·         摘要:《SQL Server 2008基础教程》第6章创建索引和数据库关系图,本章介绍了数据库关系图。数据库关系图一开始就应该被考虑作为文档的组成部分。本节为大家介绍保持数据的排序。
·         标签:索引  SQL Server  SQL Server 2008基础教程
·          
限时报名参加“甲骨文全球大会·2010·北京”及“JavaOne和甲骨文开发者大会2010

相关教程