e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 数据库 >> MySQL教程 >> 详解SQL Server数据库索引 >> 教程正文
 
教程搜索
 
 
相关教程
  • 详解SQL Server数据库索引
  • Mysql服务无法启动的1067错误解决!
  • MySQL的管理工具:phpMyAdmin
  • MySQL常用操作命令
  • 安装MySQL步骤详解
  • 从MySQL得到最大的性能
  • 通过C API远程连接Mysql Server
  • MySQL5安装详细介绍
  • 如何在windows系统下安装MySQL
  • 在Linux/Unix平台下安装MySQL
  • MySQL5数据库与管理相关的注意点(重设
  • MySQL的常见错误的解决方法
  • 在MySQL数据库中执行SQL语句时的几个注
  • MySQL5新特点(视图)
  • MySQL5新特点(触发器)
  • MySQL5新特点(存储过程)
 
 

图文教程


  • 详解SQL Server数据库索引

  • 超轻松!Excel2007帮老师用颜色区别分数

  • MSN保护盾问世 微软携手金山软件合力打

  • Linux发行版介绍:Novell SUSE!

  • Linux发行版介绍:Debian GNU/Linux
 
 
赞 助 商
 
 
详解SQL Server数据库索引
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2008-10-28

  一、理解索引的结构

  索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。

  SQL Server 中数据存储的基本单位是页(Page)。数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行。也就是说,SQL Server 每次读取或写入数据的最少数据单位是数据页。

  下面我们先简单的了解一下索引的体系结构:

  1. 聚集索引结构

  在 SQL Server 中,索引是按 B 树结构进行组织的。

  聚集索引单个分区中的结构:

  

详解SQLServer数据库索引

  --建立UserAddDate聚集索引

  CREATE CLUSTERED INDEX [IX_UserAddDate] ON [ASPNet_zSurvey].[ZS_User]

  (

  [UserAddDate] ASC

  )

  聚集索引(Clustered Index)特点

  聚集索引的叶节点就是实际的数据页

  聚集索引中的排序顺序仅仅表示数据页链在逻辑上是有序的。而不是按照顺序物理的存储在磁盘上

  行的物理位置和行在索引中的位置是相同的

  每个表只能有一个聚集索引

  聚集索引的平均大小大约为表大小的5%左右

  2.非聚集索引结构

  非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点:

  1. 基础表的数据行不按非聚集键的顺序排序和存储。

  2. 非聚集索引的叶层是由索引页而不是由数据页组成。

  下图示意了单个分区中的非聚集索引结构:

  

详解SQLServer数据库索引

  包含列的索引

  通过将包含列(称为非键列)添加到索引的叶级,可以扩展非聚集索引的功能。键列存储在非聚集索引的所有级别,而非键列仅存储在叶级别。

  下面举个简单的例子来说明一下聚集索引和非聚集索引的区别:

  我们有一本汉语字典,可以把它的正文本身看做是一个聚集索引,它是按照汉字拼音的开头字母排序的,不再需要查找其他目录。当遇到不认识的字时,需要结合“部首目录”和“检字表”, 先找到目录中的结果,然后再翻到您所需要的页码。通过这种方法查到的目录中字的排序并不是真正的正文的排序方法。把这种看做是一个非聚集索引。

  另外,请注意每个表只能有一个聚集索引。

  --建立UserAddDate非聚集索引

  CREATE NONCLUSTERED INDEX [IX_UserAddDate] ON [ASPNet_zSurvey].[ZS_User]

  (

  [UserAddDate] ASC

  )

  非聚集索引 (Unclustered Index) 特点

  非聚集索引的页,不是数据,而是指向数据页的页。

  若未指定索引类型,则默认为非聚集索引

  叶节点页的次序和表的物理存储次序不同

  每个表最多可以有249个非聚集索引

  在非聚集索引创建之前创建聚集索引(否则会引发索引重建)

  二、选择建立哪种索引

  1.何时创建聚集索引更能提高性能

  Clustered Index会提高大多数table的性能,尤其是当它满足以下条件时:

  独特, 狭窄, 持续增长的,最好是只向上增加。例如:

  •Identity

  •Date, identity

  •GUID (only when using newsequentialid() function)

  2.非聚集索引提高性能的方法

  非聚集索引由于B树的节点不是具体数据页,有时候由于这个原因,会导致非聚集索引甚至不如表遍历来的快。但是,非聚集索引有个特性,如果你要查询的内容,在非聚集索引中以及被覆盖到了,则不需要继续到聚集索引,或者RID(heap结构中的行标识符)中去寻找数据了,这时候就可以很大的提高性能,这就是 覆盖面(Covering) 的问题。

  由于聚集索引叶子节点就是具体数据,所以聚集索引的覆盖率是 100%, 通过提高覆盖面来提高性能的问题也就只有非聚集索引(Nonclustered Indexes)才存在。

  当查询中所有的columns 都包括在index上时,我们说这个 index covers the query. Columns的顺序在此不重要(Select 时候的顺序不重要,但是Index 建立的顺序可得小心了)。

  在 SQL Server 2005 中,为了提高这种 Covering 带来的好处,甚至可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。

  补充:只有查询在具有高度选择性的情况下,非聚集索引才有优势。

  三、使用聚集索引或非聚集索引的场景 (注:优先级依次为推荐,应,不应)

  

详解SQLServer数据库索引

  四、主键和聚集索引的比较

  

详解SQLServer数据库索引

  以下是一些大众点评网中测试使用的示例:

  CHECKPOINT

  DBCC DROPCLEANBUFFERS

  SET STATISTICS IO ON

  declare @d datetime

  set @d=getdate()

  SELECT * FROM ASPNet_zSurvey.ZS_User WHERE UserAddDate>'2008-06-01' AND UserAddDate<'2008-06-10'

  select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())

  --(45077 行受影响)

  --表'ZS_User'。扫描计数1,逻辑读取1103 次,物理读取2 次,预读1090 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

  --2543

  CHECKPOINT

  DBCC DROPCLEANBUFFERS

  SET STATISTICS IO ON

  declare @d datetime

  set @d=getdate()

  SELECT * FROM ASPNet_zSurvey.ZS_User WITH (INDEX=IX_UserAddDate) WHERE UserAddDate>'2008-06-01' AND UserAddDate<'2008-06-10'

  select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())

  --(45077 行受影响)

  --表'ZS_User'。扫描计数1,逻辑读取45165 次,物理读取133 次,预读141 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

  --3860

  五、使用索引的代价

  索引需要占用数据表以外的物理存储空间。

  创建索引和维护索引要花费一定的时间。

  当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。

  • 上一篇教程: Mysql服务无法启动的1067错误解决!
  • 下一篇教程: 没有了
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.