设计SQL Server非聚簇索引优化查询(上)

日期: 2009-03-23 作者:Matthew Schroeder翻译:曾少宁 来源:TechTarget中国 英文

非聚簇索引是书签,它们让SQL Server找到我们所查询的数据的访问捷径。非聚簇索引是很重要的,因为它们允许我们只查询一个特定子集的数据,而不需要扫描整个表。对于这个重要主题的探讨,我们首先从了解基础开始,比如,聚簇索引与非聚簇索引如何互相作用,如何选择域,何时使用复合索引以及统计是如何影响非聚簇索引的。 SQL Server中的非聚簇索引基础 非聚簇索引由所选择的域和聚簇索引值所组成。

如果聚簇索引不是定义为唯一的,那么SQL Server将使用一个聚簇索引值及一个唯一值。一定要将聚簇索引定义为唯一的——如果它们实际上就是唯一的——因为它会带来更小的聚簇索引/非聚簇索引。如果我们的唯一聚簇索……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

非聚簇索引是书签,它们让SQL Server找到我们所查询的数据的访问捷径。非聚簇索引是很重要的,因为它们允许我们只查询一个特定子集的数据,而不需要扫描整个表。对于这个重要主题的探讨,我们首先从了解基础开始,比如,聚簇索引与非聚簇索引如何互相作用,如何选择域,何时使用复合索引以及统计是如何影响非聚簇索引的。

SQL Server中的非聚簇索引基础

非聚簇索引由所选择的域和聚簇索引值所组成。如果聚簇索引不是定义为唯一的,那么SQL Server将使用一个聚簇索引值及一个唯一值。一定要将聚簇索引定义为唯一的——如果它们实际上就是唯一的——因为它会带来更小的聚簇索引/非聚簇索引。如果我们的唯一聚簇索引由一个INT构成,并且我们还在一个年字段(定义为SAMLLINT)上创建了一个非聚簇索引,这样的这个非聚簇索引相对于表中每行都将包含一个INT和SAMLLINT。索引的大小将随着所选数据类型不同而增长。因此,聚簇索引/非聚簇索引数据类型越小,索引也就会越小,这样就提高了可维护性。

选择非聚簇索引的域

第一条规则是不要在非聚簇索引中包含聚簇索引键的域。由于域已经是聚簇索引的一部分,因此,它总是用来查询的。在非聚簇索引中包含任意聚簇索引键的唯一情况是,当聚簇索引是一个复合索引并且查询是指向复合索引中的第二、第三或更高域时。

假设我们有如下表:

ID (identity, clustered unique)

DateFrom

DateTo

Amt

DateInserted

Description

现在假设我们总是运行如下查询:

Example 1:


Select *
From tbl [t]
where t.datefrom = '12/12/2006' and
t.DateTo = '12/31/2006' and t.DateInserted
= '12/01/2006'

在这里,在DateFrom、DateTo和DateInserted上定义非聚簇索引是合理的,因为它总能提供最佳的唯一结果。

现在假设我们运行如下多个查询:

Example 2:


Select *
From tbl [t] 
where t.datefrom = '12/12/2006' and 
t.DateInserted = '12/01/2006'
Select *
From tbl [t] 
where t.datefrom = '12/12/2006'
Select *
From tbl [t] 
where t.DateTo = '12/31/2006'
Select *
From tbl [t] 
where t.DateInserted = '12/01/2006'
Select *
From tbl [t] 
where t.DateTo = '12/31/2006' and 
t.DateInserted = '12/01/2006'
Select *
From tbl [t] 
where t.id = 5 and t.DateTo = '12/31/2006'
and t.DateInserted = '12/01/2006'

在这里,很多人都会尝试创建如下非聚簇索引:

1. DateFrom
    2. DateTo
    3. DateInserted
  4. DateTo and DateInserted
  5. DateFrom and DateInserted
  6. ID, DateTo and DateInserted

在这里,可能我们都预计索引的大小会明显增大,因为我们将DateFrom存储在两个不同的位置,DateTo存储在三个位置,以及Datelnserted存储在四个位置。在此之前,我们已经将聚簇索引键存储在七个位置存储了。这个方法提高了I/O的插入、更新和删除操作(也称为IUD操作)。记录更新必须首先写入聚簇索引数据行。然后,将对非聚簇索引进行更新以使它们可写。

作者

Matthew Schroeder
Matthew Schroeder

Matt在SQL Server和Oracle这两个领域具有12年的经验。他获得微软MCITP认证、是一名数据库开发人员,他还获得了计算机科学专业硕士学位是SQL Server数据库系统高级软件工程师,范围从2 GB到3+ TB、2k和40+ktrans/sec之间。目前他任职于IGT公司,同样是一名独立的咨询师、专攻覆盖自动化、电子商务、娱乐和银行业的SQL Server、Oracle以及.NET方面。Matt擅长OLTP/OLAP数据库管理系统以及用.NET语言写可升级的处理系统。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐