VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > sql数据库 >
  • sql语句大全之在查询编辑器中创建索引:模板(

6.5.4  在查询编辑器中创建索引:模板(2
(8) 突出显示该索引,右击,再选择"属性",会显示一些不同的信息。在图6-8所示的对话框中,不仅提供了索引的图形化版本,还列出了很多其他的潜在选项。
http://images.51cto.com/files/uploadimg/20090515/130945723.jpg
(点击查看大图)图6-8  "索引属性"对话框
 
(9) 如果在表中输入了数据,或是处于生产环境中,最有趣的选项卡是"碎片"选项卡。在数据被修改时,索引也会被修改。就像硬盘数据也会存在碎片一样,索引中的数据也会由于碎片而难于使用。这会降低索引的速度,而且,正如在本章前面提到的那样,最重要的是应该对索引经常检查,以确保它们有最好的速度和性能。当用户仍在使用系统的时候,SQL Server仍能尽可能地修正碎片。通过选中图6-9底部的"重新组织索引"复选框,可以实现对索引的重新组织。稍复杂一点的步骤是,在对象资源管理器中突出显示索引,右击以打开子菜单,并选择"重新组织"。
http://images.51cto.com/files/uploadimg/20090515/131014672.jpg
(点击查看大图)图6-9  检查索引碎片
 
最后一种创建索引的方法是在查询编辑器中手工输入所有的索引代码。我们在下节介绍。

6.5.5  在查询编辑器中创建索引:SQL代码
在下面的练习中,我们将在查询编辑器中创建两个索引和一个主键。这允许我们在下一节中构建TransactionDetails.Transactions和TransactionDetails.TransactionTypes这两个表之间的外键。该代码也说明了如何为前面讨论CREATE INDEX的语法时提到的索引构建T-SQL定义选项。
注解 在执行代码之前,下面练习中所讨论的代码被分成了3个部分。这是为让它们更容易理解。
练习:使用查询编辑器来创建索引
(1) 在一个空白的查询编辑器窗口中输入下面的代码。在这一节中,要创建的第一个索引是一个位于TransactionDetails.TransactionTypes表中的唯一聚集索引。
http://images.51cto.com/files/uploadimg/20090515/131146473.jpg
 
 
(2) 要创建的第二个索引是位于TransactionDetails.Transactions表中的基于TransactionType列的非聚集索引。不应该将它设置为聚集索引,因为最好的方式是将CustomerId列或DateEntered列作为聚集列。
http://images.51cto.com/files/uploadimg/20090515/131159984.jpg
 
 
(3) 最后一步是为TransactionDetails.TransactionTypes表添加一个主键。这可以通过ALTER TABLE语句来完成。
http://images.51cto.com/files/uploadimg/20090515/131226944.jpg
 
 
(4) 现在可以通过按下F5或Ctrl+E,或者点击工具条上的"执行"按钮,运行代码。你会看到如下的成功信息。
命令已成功完成。
在本例中,创建了两个不同的索引。第一个是一个唯一聚集索引,它基于TransactionDetails. TransactionTypes表的标识列。之所以选择该列,是因为要使用TransactionTypes列来连接到该表。有时候可能也会基于该表的其他列,不过这非常少见。由于在该表中只会输入很少的记录,所以其开销是微不足道的,也没有实际的利害关系。它也允许我们查看在本例中关键字所放置的位置。
第二个索引构建在TransactionDetails.Transactions表上,它不能是一个唯一索引。因为会存在具有相同类型的多个事务,所以会存在具有相同值的多条记录。然而,仍然可能将该索引设置为聚集的。在事务中改变事务类型是很少见的,也就是说,如果在本系统中构建了完整的审核机制,我们就可以"封杀"这类改变事务类型的操作。在这种"封杀"的情形下,要改变事务类型,唯一的方法就是取消这一项,记录这个取消行为,再创建一个新的输入项。然而,事务类型上的聚集索引并不能带来性能上的改善,因为基于单独的事务类型只会有很少的数据查询。正如早先提到过的,设置为聚集索引并非最好的选择。
在本例中最有趣的地方是在一次执行中同时创建两个索引。虽然在前面的例子中使用的是两个批事务,而一次只创建了一个索引。请注意在两个创建索引的CREATE语句之间的GO关键字。每个索引创建过程都完成于此,而不需要包含任何其他的SQL语句。如果需要创建不止一个索引,而且又想同时构建它们,这可能是你所需要的解决方案(请参看第8章以了解事务的相关细节)。
有一点我们还没有说明,如果试图用相同的索引名称重复创建索引,会发生什么情况?以前的索引已经被创建,但是又再次运行了查询,SQL Server会产生一个错误消息,提示该索引已经存在,你会看到类似下面的信息:
消息1913,级别16,状态1,第1行
操作失败,因为在表'TransactionDetails.TransactionTypes' 上已存在名称为'IX_TransactionTypes' 的索引或统计信息。
消息1913,级别16,状态1,第1行
操作失败,因为在表'TransactionDetails.Transactions' 上已存在名称为'IX_Transactions_TType' 的索引或统计信息。
消息1779,级别16,状态0,第1行
表'TransactionTypes' 已经有针对它定义的主键。
消息1750,级别16,状态0,第1行
无法创建约束。请参阅前面的错误消息。
即使改变了索引的内容,并让索引中包含不同的列,但只要使用了相同的名称,就无法创建该索引。
在本例的最后,我们对表进行了修改,以添加主键。在表中,可以定义不同类型的CONSTRAINTS:默认时使用列约束,但是,正如我们在前一章中所看到的,约束也可以用于主键和外键。
重申一遍,在这一节中,介绍了几个新的领域,而你现在已经得到了创建最常用索引所需的信息。与创建表比较而言,创建索引只需要很少的代码,非常快捷和容易。然而,如果往一个现有的充满信息的表中添加新索引,可能要花较长的时间才能完成,这要看具体的情况。可以在系统被使用的时候,或是表或聚集索引被更新的时候,添加索引。这只在SQL Server的企业版中提供,这需要为索引的行为指定REBUILD WITH (ONLINE = ON)选项。在使用这些选项的时候要小心,因为在索引被构建时,如果有用户试图访问同索引相关的表,SQL Server就不会识别该索引,在使用最好的方法来访问数据时,会忽略该索引,直到它被构建完成。
如果为了重建统计信息,而在删除索引之后创建索引,可能会出现问题。例如,如果没有使用ONLINE = ON选项。当该选项设置为ON时,SQL Server将允许对表进行访问,以添加或修改数据。然而,如果该选项设置为OFF,则所有对表的操作都必须等待,直到完成了索引重建。这就意味着,当正在生成索引时,系统中任何其他部分如果要访问索引所在的表,访问都会暂停。因此,如果你是在当前可用的数据库上重建索引,则必须权衡这两个可能出现的问题,决定哪一种是可以接受的。



相关教程