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

 SqlServer的性能问题大部分是因为缺少索引或索引不当导致的,因此熟悉掌握索引相关知识是精通SqlServer的第一步。我们可以从索引的数据结构了解索引的本质;掌握聚集索引和非聚集索引的区别有助于我们在不同场景下走出误区、建立合适索引;在一些场景下你也有可能需要用到索引视图。

索引的数据结构

在SqlServer中,聚集索引和非聚集索引都是以B+树存储。一颗m阶的B+树满足下列条件:

  • 树中每个结点至多有m个孩子。除根结点和叶子结点外,其它每个结点至少有m/2个孩子。根结点至少有两个孩子。
  • 所有叶子结点都位于同一层。
  • 有n颗子树的结点中含有n个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子结点。叶子结点本身依关键字的大小顺序链接。

  

二叉查找算法效率很高,但由于树的深度过大会导致频繁的磁盘I/O,影响查询效率。平衡多路查找树(B树)可以大大减少树的深度,作为索引的数据结构非常适合。

聚集索引的叶子节点存的是数据。

 

非聚集索引的叶子节点存的是指向堆或聚集索引的指针.

 

 

聚集索引、非聚集索引

区别

  • 聚集索引存储的记录在物理上是连续的,非聚集索引对应的记录在物理上并不连续。(非聚集索引的键值在物理上是连续的)
  • 聚集索引一张表只能有一个,非聚集索引有多个

索引列的选择

  • 根据Where条件、Order条件选择列
  • 优先选取选择性大的列,过滤条件精确的列(“=”要优于”between”)

书签查找

当使用非聚集索引查找时,如果查询用到的列不包含在非聚集索引中时,就需要一次书签查找来检索其它字段。书签查找会产生更多的逻辑读,当书签查找次数过多(几百或几千),SqlServer会舍弃非聚集索引而使用全表扫描(索引失效),这会导致查询效率非常低。

包含列

将不在非聚集索引中的列放到包含列中,可以避免书签查找。相对于聚集索引,由于每页的数据更多,查询效率最高。

适用场景

  • 需要读取大量数据时(统计):通常会使用聚集索引。如果查询用到列总大小远小于行大小,应选择非聚集索引+包含列(连续读的数据量小很多)。
  • 不需要读取大量数据时(分页查询):优先使用聚集索引(索引过多会影响更新、删除性能。)
  • 多视角都满足使用聚集索引的场景时,基于数据量大的查询建立聚集索引,其它的建立非聚集索引。

    注:多视角指的多个维度或方面去查看数据,它们的索引列不同

           数据量大小评估需要综合参考查询涉及的行数和列的大小   

索引视图

  概念

      为视图创建唯一聚集索引可以提高查询性能,因为视图在数据库中的存储方式与具有聚集索引的表的存储方式相同。查询优化器可以使用索引视图加快查询速度。优化器使用索引视图是隐式的,并不需要在查询中引用该视图。

      创建唯一聚集索引后可以创建更多的非聚集索引。

适用场景

      需要创建索引的列分布在多个表上。

限制

      视图定义中不能包含统计函数(count、distinct、min、max),Outer连接、开窗函数、集合函数(union、except)等。

              

参考

B树

http://www.cnblogs.com/tgycoder/p/5077017.html

http://www.cnblogs.com/zhijianliutang/archive/2012/02/03/2337340.html

书签查找

http://www.cnblogs.com/lzrabbit/archive/2012/05/21/2499389.html

索引视图

https://msdn.microsoft.com/zh-cn/library/ms191432.aspx


相关教程