当前位置:首页 > 系统运维 > 正文内容

实现SQL Server 索引底层与操作中的注意事项

a8116255316年前 (2010-07-23)系统运维6

本文主要介绍的是SQL Server 索引底层的实现,以及对索引结构的具体描述,非聚集索引的描述,以及对非聚集索引在实际操作中要注意的相关事项的具体描述,以下就是文章的相关问题的描述。

页和盘区(Page and Extents)

你的表(Tables)中数据实际上都存储在页(pages)里,除了BLOB类型的数据。假如某列的字段的类型为BLOB那么将有一个16字节的指针指向BLOB page。页是MS SQL Server中数据存储的最小单位。

每页包含以行(row)为单位保存数据。一行只能存储在一个页中。每页可以容纳8KB的信息。因为这个原因,每行的更大值为8KB。一组相邻的8个页被称为一个盘区(Extent)

堆文件和分配映射索引(Heap and the Index Allocation Map(IAM))

堆文件在sysindexs表中只有一行记录,并且其indid = 0. sysindexs.FIRstIAM字段指向了IAM页链表中一个IAM页,IAM页是用来管理SQL Server已经给堆文件分配的空间。MS SQL Server2000用IAM(Index Allocation Map)页来在堆文件中导航(navigate)。在堆文件中,数据页(data page)和数据页中数据没有按照特定的顺序存储,也没有链接在一起。数据页之间唯一的逻辑链接是通过IAM页中记录来实现的。

索引结构(Index Structure)

所有的SQL Server 索引都是 B-Trees。在这种树的顶端有一个根页(root page),通过root page来访问N个中级(intermediate level)页,直到树的底部、或叶级(leaf level)。可以通过树中每个节点的指针从上向下扫描整个索引树。另外,每个SQL Server 索引级(index leves)(可能是intermediate leve or leaf level)都有一个页链(page chain)。

在一个索引中有许多intermediate level。索引树的级数(树的高度)与索引码的宽度、索引类型、记录行数和表中的页数有关,并且索引树的级数是影响索引性能的一个重要参数。

非聚集索引(Nonclustered Indexs)

一个非聚集索引与一本书的索引相似。数据存储在一个地方,索引存储在另外一个地方,可以通过索引中的指针来访问存储的数据。索引中的条目是按照索引码的值按序存储,但是表中的信息可以按照不同的顺序存储(如可以按照聚集索引存储)。假如表中没有创建聚集索引,那么表中的记录就不能保证按照某种特定的顺序。

与你用一本书的索引方式一样,SQL Server2000也是先通过非聚集索引检索到查找数据在表的位置,然后通过该位置来检索数据。这使得非聚集索引非常适合精确匹配查询(This makes nonclustered indexes the optimal choice for exact match queries),因为索引条目中包含了你需要查找数据的位置信息。

假如当前的表是以聚集索引方式存储,那么非聚集索引的位置信息就是聚集索引的索引码(index key);否则,位置信息就是row ID(RID),每个RID由file number、page number和 slot number of row(每行记录的槽号)。比如,要在一个表中检索某个employee ID(emp_id),该表已经有在emp_id列上创建了非聚集SQL Server 索引,SQL Server查找索引树,找到一个索引条目包含你需要查找的emp_id,然后利用其中RID来访问到对应数据页中的值。

注意事项

非聚集索引适用于以下场景:

列中包含大量的不同值,如last name 和 first name 构成的复合索引(假如已用另外列创建的聚集索引) 。假如某列中只有很少的不同值,如0或者1,大多数查询不会利用该索引的,因为一个表扫描通常更有效率。

不返回大量结果集的查询 Queries that not return large result sets

经常被包含在一个查询条件语句(WHERE clause)的列,且该查询返回精确配备(return exact matches)

决策支持系统中经常需要表之间的关联(join)和聚集(group)。在被包含在join和grouping操作的列上建立非聚集索引,和在外键列上建立聚集索引。

一个给定的查询包含了表中所有的列,这样可以减少对表或聚集SQL Server 索引的访问。(Covering all columns from one table in a given query. This eliminates accessing the table or clustered index altogether.)我的理解就是覆盖索引。

聚集索引(Clustered Indexs)

一个聚集索引决定了一个表中数据的物理存储顺序。一个聚集索引与一个 *** 目录相似, *** 目录是按照last name来存放。因为聚集索引决定一张表中数据的物理存放顺序,所以一张表只能有个聚集索引,一个聚集索引可以包含多个列(复合索引),就像 *** 目录一样按照last name 和 first name记录一样,聚集索引与Oracle中的IOT'S(Index-Organized Tables)相似。

一个聚集索引对范围查询非常有效率efficient on columns that are often searched for ranges of values。当用聚集索引把之一个行检索出来之后,后续行一定能保证在物理上是相邻的。例如,应用的某个查询需要频繁执行一个范围查询,聚集索引可以快速定位到满足条件的之一个数据,然后再检索表中与之相邻的记录直到最后一条记录。

这样可以调高这类查询的性能。另外,假如某列经常用来对表中的数据进行排序(sort),该情况下也可利用聚集SQL Server 索引来节省每次排序的时间。

当索引值唯一时,需要查找一个指定行,此时聚集索引也是高效率的。例如,用最快的方式来找到一个指定empoyee ID的employee记录就是在emp_id列上创建一个聚集索引。

注意事项

在创建聚集索引时,SQL Server 索引列应该尽量少,这一点很重要。假如定义一个大的索引码,那么该表中的任何非聚集索引就会显著的增大,因为每个非聚集索引叶级索引条目都包含了一个聚集索引码。

聚集SQL Server 索引适用于以下场景:

列中包含大量的不同值

返回一个范围记录的查询,像BETWEEN, >, >=, <, and <=.的操作;

顺序访问的列

返回大量记录的查询

在查询中某列被频繁的包含在join或group语句中,尤其该列也是该表的外键。在ORDER BY或 GROUP BY语句的列上建立聚集索引可以减少SQL Server对数据的排序,因为表中行已经是有序的了,这样可提高查询的性能。

在OLTP类的应用中经常需要快速查找某行记录,尤其是一主键的来查找,此时可在主键上创建一个聚集索引。

聚集索引不适合以下场景:

频繁变化的列。这样造成了表中行经常移动,

宽键(wide keys)聚集索引的SQL Server 索引码被所有的非聚集索引来用来检索,所被存储在每个非聚集索引的叶级索引条目中。

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://2345hao.cn/blog/index.php/post/22226.html

分享给朋友:

“实现SQL Server 索引底层与操作中的注意事项” 的相关文章

微软今天正式停止对windows 7的主流支持

微软今天正式停止对windows 7的主流支持

北京时间1月13日消息,根据计划,微软将于2015年1月13日正式结束对Windows 7SP1的“主流支持”,而这也标志着“扩展支持”阶段的开始,这个阶段将于2020年1月14日结束。 2013年10月份,微软终止销售独立的Windows 7系统安装包,并要求制造商于2014年10月份停止生...

Skylake平台不能通过USB接口装windows 7系统

Skylake平台不能通过USB接口装windows 7系统

Intel会在2015年推出Broadwell、Skylake两代14nm处理器,前者可以使用9系芯片组,Skylake升级到了LGA1151插槽,需要搭配新的100系列芯片组,但初期的Skylake-S又不能超倍频,所以今年Q2季度开始会很混杂。Skylake一代会支持DDR4,100系列芯片组升...

Ubuntu 14.10上安装新的字体图文教程

Ubuntu 14.10上安装新的字体图文教程

像Ubuntu这种开源系统,一般都自带有好多漂亮的字体,不过假如您想使用您熟悉的字体,可以通过在Ubuntu或其它Linux系统上安装字体,帮助用户在使用开源OS平台上更好的视图体验。 软件名称:Ubuntu 14.04 官方正式版软件大小:752MB更新时间:2014-05-07 Ubun...

windows 7禁用粘滞键(连续按 Shift 五次)的方法

windows 7禁用粘滞键(连续按 Shift 五次)的方法

我们都知道连续按 Shift 五次可以启用或关闭粘滞键,但是假如我们不需要粘滞键,想要将它禁用该怎么设置呢?现在小编就教你解决这个问题的方法吧。 具体操作步骤如下: 1、首先依次点击“开始—控制面板—轻松访问中心—使键盘更容易进行使用”项; 2、在弹出来的界面中,取消勾选“启用粘滞键”...

QQ远程协助不能控制windows 7系统的电脑该怎么办

QQ远程协助不能控制windows 7系统的电脑该怎么办

当对方使用Windows 7系统的时候,为什么有些时候QQ远程协助控制不了Windows 7的电脑,经常遇到这样的情况,远程连接上了,有些项可以点,有些项点一下就卡死了,点不动了,必须我们经常要用到磁盘管理,当我们点到这个项目的时候对方的电脑画面就卡住了再点鼠标也没有任何反应,这是怎么回事? 经...

windows 7任务栏的颜色默认的并不好看如何修改

windows 7任务栏的颜色默认的并不好看如何修改

有些用户不喜欢Windows 7任务栏的颜色,想要换种自己喜欢的,该怎么做呢?现在小编就和大家一起分享修改Windows 7任务栏颜色的方法吧。 步骤 首先打开“控制面板”,找到“个性化”,如下图所示 接上步骤,打开“个性化”,如下图,找到“窗口颜色” 3接上步骤,点开“窗口颜色”,...