关闭

谈“索引”

1330人阅读 评论(0) 收藏 举报

谈“索引”
(一)创建索引
对于数据库中较小的表来说,使用扫描原始数据的方法可以工作很好,然而,当数据量变大时,就必须使用索引来提高数据检索的速度。
在考虑索引的创建时,需要注意的是:提高查找速度与提高更新速度是相互矛盾的。索引可以极大地提高读取数据的速度,但在写数据时,它们却会带来额外的工作。
使用图形界面工具创建和管理索引的方法主要有下面3种:
1.     创建索引向导。可以从向导列表中启动它。
2.     使用索引管理器。与创建索引向导相比,企业管理器的索引管理器是一个非常出色的工具,可以使用它来查看和管理一个表的所有索引。打开它的方法是:选择一个表,然后右击或者“操作”菜单上选择“所有任务”〉“管理索引”菜单项即可。
3.     表的“属性”对话框。该对话框的“索引/键”选项卡就是用来完成这项工作的。(注意:这个“索引/键”选项卡的界面设计稍微有点问题,即在其顶部的组合框用于选择要修改的索引,但却没有“确定”或者“应用”按钮,但无论在其中输入什么,都会随同在表设计器中所做的其它改变一起应用到表上的。
(二)理解索引
SQL Server使用两种基本类型的索引:聚集索引和非聚集索引。这两种索引都可以对多个列进行索引,在这种情况下也可以称它们为组合索引。
1.     非聚集索引。在代码中创建非聚集索引的方法是:使用CREATE INDEX DDL命令,并指定相应的索引名,以及要进行索引的表和列。如:
CREATE NONCLUSTERED INDEX IxOrderNumber
   ON dbo.[Order] (OrderNumber)
       在计算列上也可以创建索引,但是,如果想要在计算列或者索引视图上创建和修改索引,必须先将quoted_identifier选项设置为on
2.     聚集索引。聚集索引将表中的记录行与索引键值以同样的顺序加以存储。电话簿就是一个很好的聚集索引的例子,其中数据和索引都以同样的顺序加以存储。在聚集索引的内部,SQL Server合并了索引页的叶节点与数据页,也正由于数据只可能有一种物理存储顺序,因此每个表只能有一个聚集索引。
注:(1)合并聚集索引的叶节点与数据具有两个作用。首先,通过聚集索引检索数据只需要更少的逻辑读取的次数。其次,任意非聚集索引都将指向聚集索引的ID,而不再需要指向数据页。
 (2)聚集索引将具有同样索引键值的记录行集中到尽可能少的数据页中,因而减少了检索一组记录时需要读取数据的页数,基于同样的原因,对于只返回一行记录的查询,使用聚集索引将不会明显地提高性能。从中我们可总结出:因为在每个表上只能创建一个聚集索引,所以它也是一种宝贵的性能资源,只有在那些经常作为条件查询一组记录行的列上才应该建立聚集索引。
在代码中创建聚集索引的方法与创建非聚集索引的方法非常类似,如:
CREATE CLUSTERED INDEX IxOrderID
   ON dbo.OrderDetail (OrderID)
删除索引的方法是:使用DROP INDEX命令,并指定相应的表名和索引名:
DROP INDEX OrderDetail.IxOrderID
3. 组合索引。组合索引是拥有多个索引列的聚集或者非聚集索引,正因如此,只有在创建表之后,才能使用CREATE INDEX DDL命令来创建它们。如:
CREATE CLUSTERED INDEX IxGuideName
   ON dbo.Guide (LastName, FirstName)
在组合索引中,索引列排列的先后顺序非常重要。因为,只有这样的一些查询才能够使用组合索引:它们在查询条件中所包含的索引列在组合索引中是从第一个索引列开始按照从左到右的顺序依次排列的。
最后,在文章快结束的时候,再介绍一点(这一点好好重要噢!~):索引填充因子(FillFactor)应该设置为多少才最合适,取决于数据库的用途。如果数据库主要用于数据检索,就应当将填充因子设置为较大的值以尽可能填满一个索引页的空间;反之,如果需要对表进行大量的插入操作,在索引页上保留一些空间就可以提高更新操作的性能;还有,如果对于表插入操作的数量变化幅度较大,将填充因子设置为一个中间的值,并选择填充索引(PAD_INDEX)选项就比较合适了!
CREATE INDEX命令中也可以指定填充因子和填充索引选项。例如下面的代码在[Order]表的OrderNumber列上创建一个索引,并指定在叶节点和中间级节点上都保留15%的自由空间:
CREATE NONCLUSTERED INDEX IxOrderNumber
     ON dbo.[Order] ((OrderNumber)
         WITH TILLFACTOR=85, PAD_INDEX
好了,今天就到这里吧!我去吃饭了,哈哈!~
 
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:46615次
    • 积分:772
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:6篇
    • 译文:1篇
    • 评论:21条
    文章分类
    最新评论