`
mywebcode
  • 浏览: 998874 次
文章分类
社区版块
存档分类
最新评论

SQL Server 索引(index)

 
阅读更多

1.索引(index)在数据库中是如何设计实现的

所有的索引(index)都存储在一个 B-tree 的数据结构当中,索引(index)的开始节点作为 B-tree 的根节点。其中的 索引(index)作为中间节点一起组成一棵 B-tree;中间节点是由索引列数据组成的(由于中间节点的大小的一样,所以索引列的不能过大,不然一个节点容纳的索引列太少,对应的查找时间就会增加)。在 B-tree 的底部就是叶节点;叶节点根据索引(index)是聚集索引(clustered index)还是非聚集索引(nonclustered index)而有所不同。

如果是聚集索引(clustered index),叶节点实际是数据页面本身;(见下图 Figure 5-1)

如果非聚集索引(nonclustered index),叶节点是一个指针(pointer),它指向一个heap结构或者聚集索引的数据页面。(见下图 Figure 5-2)

聚集索引决定了table中数据的物理存储方式,一个table只能有一个聚集索引(clustered index)。我的理解就是table中的数据在物理存储上按照聚集索引进行排序。所以后面的内容也讲到:聚集索引列最好是那些不会被频繁修改的列,否则整个数据表的数据会经常移动的,数据库的性能就会很差。




2.索引列(index column)如何选择

前文已经讲述了index是用一个B-tree来保存的,所以接下来讲解如何选择索引,应该就容易理解了。

聚集索引(clustered index)列最佳选择

1) 那些包含在范围查询语句当中的列;如 between 关键字中的列、或 > (大于比较) 或 < (小于比较) 中的数据列。
2) order关键字中的数据列
3) 聚集函数中的数据列
4) 表中值唯一的列
聚集索引(clustered index)列不宜选择
1)频繁更新的数据列
2)字节数较大的数据列

非聚集索引(nonclustered index)列最佳选择
1)频繁使用在 WHERE 语句中的数据列
2)频繁使用在 JOIN 语句中的数据列
3)频繁使用在 ORDER BY 语句中的数据列
非聚集索引(nonclustered index)列不宜选择低选择性(selectivty)的列。
selectivty = distinct(index columns) / count(*);
即是 某种列组合的不同值 和 整个数据表的总数据行 的比值。选择非聚集索引时,这个值越高越好。

3. PAD_INDEX 和 FILLFACTOR 参数的使用

在前文我已经提到,索引不能建立在经常进行插入、删除、更新的数据表中,这样会导致整个数据的频繁移动,反而会降低性能。但是适当地设置 PAD_INDEX 和 FILLFACTOR 参数对更新的表格有一定的缓解(注意是缓解不是消除)作用。其中FILLFACTOR 就是索引的数据表页面的填充因子。例如FILLFACTOR=50表示索引数据表中有50%填充数据,另外的50%是空的,用来容纳将要插入的新数据行。
--使用实例如下
CREATE NONCLUSTERED INDEX NI_TerminationReason_TerminationReason_DepartmentID
ON HumanResources.TerminationReason
(TerminationReason ASC, DepartmentID ASC)
WITH (PAD_INDEX=ON, FILLFACTOR=50)


本文的大部分内容来自于对《SQL Server 2008 Transact-SQL Recipes (Apress 2008)》的理解。
分享到:
评论

相关推荐

    sql server 索引的使用

    sql server 索引的使用 --创建索引create index(索引关键字) indexName(索引名) on userInfo(userName,userAge) create index indexName on userInfo(userName,userAge) --查看索引 sp_helpindex userInfo --创建...

    SQLserver查询表大小,重整index碎片

    资源名称:SQLserver查询表大小,重整index碎片 资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    SQL Server 2000索引结构及使用方法

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。

    SQL Server 2000数据库中如何重建索引

    在SQL Server 2000中,如果要用一个步骤重新创建索引,而不想删除旧索引并重新创建同一索引,则使用CREATE INDEX语句的DROP_EXISTING子句可以提高效率。这一优点既适用于聚集索引也适用于非聚集索引。以删除旧索引...

    SQL Server 索引结构及其使用

    实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)

    SQLServer2005数据库学习笔记

    笔记是本人学习SQLServer一段时间后重新整理出来的,适合有一些入门基础的人学习。 ├─01 安装及使用 │ SQLServer2005安装及使用.txt │ ├─02 常用函数 │ function.sql │ ├─03 建表、建库 │ create.sql ...

    SQL Server索引管理之六大铁律

    SQL Server索引管理之六大铁律 介绍了SQLServer中对于表中字段什么情况该新建索引,挺好的。共大家参考

    sql server的性能优化x

    bookmark lookup,以 及 索引 覆 盖( Covering Index) 等 概念 , 更 好地 优化 SQL SERVER 数据 库的 性能 , 对 于 程序 开发 人 员 以 及 数 据 库 管 理人 员 在 优化 SQL SERVER 数 据 库时 提 供 帮助 。

    SQL Server数据库查询速度慢原因及优化方法

    8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是...

    sql-index-console:用于检测SQL Server索引碎片并重建索引以消除碎片的实用程序

    SQL Index Console是用于检测SQL Server索引碎片和重建/重组索引以除去碎片的实用程序。 设置 特征 检测索引碎片 获取索引的详细列表,包括类型,大小,碎片数量和其他属性。 检测索引和表碎片,包括聚集索引碎片...

    如何获得SQL Server索引使用情况

    问题: ...  在SQLServer中,许多新的DMVs被引入,供你窥探一些过往版本中不能或很难看到的数据。其中一个新函数和一个新视图是提供索引使用情况:  Sys.dm_db_index_operational_stats和sys.

    SQLServer2008查询性能优化 2/2

    书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所...

    SQLServer2008查询性能优化 1/2

    书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所...

    SQLServer2000索引结构及其使用

    微软的SQLSERVER提供了两种索引:聚集索引(clusteredindex,也称聚类索引、簇集索引)和非聚集索引(nonclusteredindex,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别: ...

    SQL Server索引的四个高级特性

    一、Index Building Filter(索引创建时过滤)  有一些索引非常低效的,比如经常查询状态为进行中的订单,...  SQLServer  支持,语法示例: create index idx_3 on order(status) where status=’running’

    索引、视图、标准SQL测试方法

    GBase8s 索引测试方法 ...伪SQL代码如下: create table t(c1 int, c2 char(10), c3 date); create index common_idx on T(C1) ; --通过系统表查询索引的ID select name, id from sysobjects where name='

    sqlserver自定义函数

    --按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便 Create function Get_StrArrayStrOfIndex ( @str varchar(1024), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第...

    Sql Server 数据库视图 索引等

    视图索引存储过程 事务显示事务 隐式事务 --索引 作用:提高查询效率 降低新增修改和删除的效率 --主键索引 唯一索引 聚集索引非聚集索引 --创建索引 --索引index 默认创建的是不唯一,非聚集索引

Global site tag (gtag.js) - Google Analytics