技术开发 频道

SQLSERVER数据访问优化之使用索引

  第一步:在列上采用正确的索引

  有些人可能争论实施正确的索引是否是数据库优化过程的第一步。但是我认为在数据库应用正确的索引是第一位的。原因有2点:

  1. 在一个产品系统里,它将使你在很快的时间内提高尽可能大的性能。

  2. 创建数据库索引不需要你做任何的系统修改,因此不需要任何重新编译和部署

  如果你发现有当前的数据库没有很好的处理索引,你建了索引,结果就是性能的快速提升。然而,如果索引已经处理了,我们进入下面的步骤。

  什么是索引

  我相信你已经明白了什么是索引,但是,我仍旧看到很多人对索引不太清楚。让我们再一次弄明白什么是索引,请看下面的小故事。

  很久以前,在一个古城市里有一个很大的图书馆,里面有数以千计的图书,图书凌乱的存放在书架上。因此,一旦有读者向图书员索要一本图书,图书员除了一本一本的检查图书,看是否匹配读者索要的图书,其它没有更好的办法。发现一本渴望的图书往往需要花费图书员数个小时。同时读者也不得不等很长的时间。

  [这看起来象一个没有主键的表,当在表里进行搜索数据的时候,数据库引擎需要遍历全部的数据来查找相关的记录,所以运行起来非常慢。]

  当读者和图书每天都在大量增加的时候,图书员的工作越来越繁重。有一天,有一个智者来到图书馆,看到图书员的繁重的工作,建议他给每一本书编号,同时按顺序码放在书架上。“我可以从中得得什么好处?”图书员问,那个智者回答到:“如果有读者通过给你一个书号来索要图书,你很快就能发现在哪个书架上存放了包含该书号的图书,然后在这个书架上,你同样能很快的找到需要的图书”

  [给书编号就象在数据表里创建一个主键,当你在一个表里创建了一个主健后,系统就创建了一个聚集索引树,所有的包含记录的数据页按照主键的值在文件系统中进行排序.每一个数据页内部也同样按照主键的值进行排序.所以,当你向数据库请求任何一个数据行的时候,首先数据库服务器使用聚焦索引找到合适的页(象首先发现书架一样),接着在页里查找包含主键值的记录(象在书架发现一本书)]

  “这正是我所需要的”,兴奋的图书员开始给书编号,接着把它们排列在不同的书架上,他花费了一天的时间来排序.在那天快结束的时候,他做了测试,结果发现几乎不用花费时间就能找到一本书.图书员高兴极了.

  [这正是你创建了主键后所发生的事情.首先,创建了聚焦索引,接着数据页在物理文件里按照主键的值被排序.有一点我想你应该很容易理解,因为数据仅仅只能使用一列的值作为凭证来排序,所以一个表只能创建一个聚焦索引.就象图书只能使用一个标准即书号来排序一样.]

  等一等,问题还没有被完全解决,在接下来的时间里,有个读者没有图书的编号 ,只有图书的名字,他想通过书名索要图书,如何办呢?可怜的图书员只能按照从1到N 来查遍所有已经编号的图书.如果图书存放在67号书架上,他可能需要20分钟,相比早间图书没有被排序的时候,他所花费的2-3个小时.这确实有一个进步.但是和花费30秒通过书号查找一本书比较起来,,20分钟仍旧是一个不短的时间.还有没有更好的办法呢?他问那个智者。

  [假设你有一个产品表,如果你只有一个ProductID主键而没有其它的索引,上述的情况同样会发生,所以,当使用产品名字来搜索的时候,数据引擎只能遍历文件里所有物理排序的数据页,没有其它的办法. ]

  那个智者告诉图书员:因为你已经按照书号对图书做了排序,你不能使用其它的凭证重新排序,所以,较好的方法是创建一个包含书名和与之对应的编号的目录或索引,在这个目录上,按照图书的字母顺序排序,并使用阿拉伯字母进行分组,例如,当有人想查找 Database Management System 这本书的时候,你使用下列的规则就能发现这本书

  1. 在书名目录里跳到D 章,找到包含你的书名的图书.

  2. 得到这本书的书号,然后用书号去查找这本书

  “你真是一个天才”,图书员喊到,他立即花费了一些时间创建了书名的目录,通过一个快速的测试,他发现使用书名来查询仅仅需要1分钟,其中30秒查找书的编号 ,30秒用编号来找书.

  图书员想到,读者还可能使用其它的凭证来查找图书,例如作者的名字,所以他为作者创建了同样的目录.在创建了这些目录后,图书员可以使用这些凭证在1分钟内找到图书. 图书员的繁重的工作终于结束了,许多读者也因为很快的查找到图书而聚集在图书馆,图书馆变的非常热闹起来.

  图书员随后开始过着他的快乐的生活,故事结束了.

  到这里,现在我确信你已经明白了什么是索引,为什么它们如此重要以及它们的内部工作原理,,例如,我们有一个已创建聚焦索引的产品表Products,因为当创建了主键的时候,随即就创建了聚焦索引。我门应当在Productname列创建一个非聚焦索引,一旦我们这样作了,数据库引擎就为非聚焦索引创建一个索引树,象故事里的书名目录,按照产品的名字在索引页里排序。每个索引页包含一定范围的产品名字和与之对应的ProductID,所以当使用产品名字作为凭证搜索的时候,数据库引擎首先查询产品名字的非聚焦索引树来发现这本书的主键productID ,一旦发现,数据库引擎就使用主键ProductID来搜索聚焦索引树,从而并得到正确的结果。

  索引树的工作原理如下图:

  上图被称做为B+树,中间的节点包含一定数量的值,指示数据库引擎当从跟节点搜索一个索引值的时候如何遍历.如果这是一个聚焦索引树,页节点是物理数据页.如果是非聚焦索引树,页节点包含包含索引值和与之对应的聚焦索引值.

  通常,在索引树里发现需要的值并且转到目标数据记录,对于数据库引擎来说花费的时间是很短的,所以,在数据库应用索引极大的提高了数据的检索操作.

  请跟随下列的步骤确保正确的索引包含在你的数据库里。

  确保数据库的每个表有一个主健

  这么做会确保每个表有一个聚焦索引,通过主健的值,表的数据页通按物理顺序排列在磁盘上。所以,任何使用主健的数据检索操作,任何在主健字段的排序操作都能非常迅速的检索数据。

  在这些列上创建非聚焦索引

   经常被作为搜索凭证的列

   用来联合其它表的列

   用来作为外健的列

   用来排序的列

   高选择性列

   Xml类型

  下面是一个创建索引的命令的例子

  CREATE INDEX

  NCLIX_OrderDetails_ProductID ON

  dbo.OrderDetails(ProductID)

  你也可以使用SQL Server控制台在需要的列上创建索引

0
相关文章