索引的使用说明

原创 2007年07月31日 10:46:00
索引的使用说明

题外话:
     昨天比较郁闷,维护一客户的数据库系统时候,发现系统处理数据就出现假死。
开始因为是软件问题,拷得乱忙一下午还没有拷定,后来一直弄到晚上7点,突然想起索引问题。
后来就使用了一命令:
dbcc dbreindex('TableName','',80)

即可实现。比较郁闷和晕,自己犯这样的错误。
     这错误,正好是我想写这帖的原因,希望能为大家解决一些实际问题吧。

正题:
为什么要建立合适的索引,重要的目的就是提高查询效率。
这里简单说一下索引的两种类型:
帮助的说明
聚集
聚集索引基于数据行的键值在表内排序和存储这些数据行。由于数据行按基于聚集索引键的排序次序存储,因此聚集索引对查找行很有效。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。数据行本身构成聚集索引的最低级别。
只有当表包含聚集索引时,表内的数据行才按排序次序存储。如果表没有聚集索引,则其数据行按堆集方式存储。
非聚集
非聚集索引具有完全独立于数据行的结构。非聚集索引的最低行包含非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。数据行不按基于非聚集键的次序存储。
在非聚集索引内,从索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页的存储方式是堆集还是聚集。对于堆集,行定位器是指向行的指针。对于有聚集索引的表,行定位器是聚集索引键。

来的例子说明最能体现建立索引的好处。

 
--测试表DTest (无索引)
SELECT IDENTITY(int,1,1AS [id],B.[id] AS TKey,B.[Name] AS [TName] INTO DTest 
FROM Master..syscolumns AS A ,Master..sysobjects AS B
--测试表TTest (建立索引)
SELECT IDENTITY(int,1,1AS [id],B.[id] AS TKey,B.[Name] AS [TName] INTO TTest 
FROM Master..syscolumns AS A ,Master..sysobjects AS B

在我的测试中,DTest,TTest表有500多万条记录,可以满足测试要求。

操作如图:
1、设置表TTest的字段ID为主键。
 

2、对表TTest中的列TName建立一个非聚集索引
 

3、测试查询语句的效率。
在查询分析器中输入:
SELECT * FROM  DTest WHERE TName='sp_ActiveDirectory_Obj'

按键盘Ctrl+L,显示预计的执行计划,可以查看执行效率。
 

预计的成本是31.8.

再在查询分析器中输入:
SELECT * FROM  TTest WHERE TName='sp_ActiveDirectory_Obj'

按键盘Ctrl+L,显示预计的执行计划,可以查看执行效率。
 
预计的成本是28.5 .
从这图可以看出,使用索引后,查询效率差不多提高了10的百分点。

下面我们再看实际查询的结果用时:
没有索引时候,用时:26秒。

 



对列Tname加索引,用时:0秒。

呵呵,明显看出效率的提高。

这里写几点注意:
1、将更新尽可能多的行的查询写入单个语句内,而不要使用多个查询更新相同的行。仅使用一个语句,就可以利用优化的索引维护。
2、对聚集索引使用整型键。另外,在唯一列、非空列或 IDENTITY 列上创建聚集索引可以获得性能收益
3、在查询经常用到的所有列上创建非聚集索引。这可以最大程度地利用隐蔽查询
4、重建索引可以重新组织索引数据(对于聚集索引还包括表数据)的存储,清除碎片。如我开始提到的使用

 
dbcc dbreindex('TableName','',80)

来重构索引。

在实际的应用中,会发现很多问题,得具体问题具体分析,这里只是简单一个例子说明使用索引的好处。

(完)
 

全表扫描和索引扫描的区别

1) 全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件。Oracle顺序地读取分配给表的每个数据块,...
  • ystyaoshengting
  • ystyaoshengting
  • 2014年11月12日 15:07
  • 2289

生物信息学习——bowtie2使用手册

用法 bowtie2 [options]* -x {-1 -2 | -U } -S [] 主要参数 -x 参考基因组(reference genome)通过bowtie2-buil...
  • ganges_zs
  • ganges_zs
  • 2017年02月28日 14:49
  • 3062

OpenGrok简单使用说明

opengrok查看android源码简单的使用说明,快速搜索定位代码位置。。
  • yin1031468524
  • yin1031468524
  • 2016年01月17日 22:49
  • 3988

sql索引类型和使用说明

唯一索引:唯一索引不允许两行具有相同的索引值 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空 聚集索引(Cluster...
  • zzy7075
  • zzy7075
  • 2011年12月21日 11:26
  • 501

Canon EOS Utility安装和使用说明

下载EOS.Utility工具          从佳能的官方网址上下载最新的EOS Utility软件。下载方法如下:          #1 访问下载与支持的网址:http://support...
  • fan_hai_ping
  • fan_hai_ping
  • 2012年12月16日 12:39
  • 35291

Droid48计算机使用说明

1、α +DROP(左旋箭头+DROP):清除一行命令      C +CLEAR(左旋箭头+CLEAR):清除4行所有字符(level1 2 3 4的4行字符) 2、α :shift的功能即选择...
  • niubidexiebiao
  • niubidexiebiao
  • 2016年04月10日 00:11
  • 1390

Makecert傻瓜教程——简单使用说明

makecert生成数字证书的简单使用教程
  • duotemplar
  • duotemplar
  • 2017年07月06日 19:20
  • 943

jQuery验证控件jquery.validate.js使用说明+中文API

官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明...
  • wuxhyou
  • wuxhyou
  • 2016年07月06日 15:14
  • 409

企业钉钉重点功能使用说明

内容多来自钉钉及tower的帮助中心,此处是帮助大家梳理主要用到的功能,方便查阅,为了隐私已打码处理个人及公司相关的名字。...
  • huitailang1991
  • huitailang1991
  • 2016年06月06日 14:31
  • 49603

svn使用说明及常用命令总结

svn使用说明及常用命令总结
  • liuli3345
  • liuli3345
  • 2014年07月01日 10:09
  • 9588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:索引的使用说明
举报原因:
原因补充:

(最多只允许输入30个字)