非聚簇索引是书签,它们让SQL Server找到我们所查询的数据的访问捷径。非聚簇索引是很重要的,因为它们允许我们只查询一个特定子集的数据,而不需要扫描整个表。对于这个重要主题的探讨,我们首先从了解基础开始,比如,聚簇索引与非聚簇索引如何互相作用,如何选择域,何时使用复合索引以及统计是如何影响非聚簇索引的。 SQL Server中的非聚簇索引基础 非聚簇索引由所选择的域和聚簇索引值所组成。
如果聚簇索引不是定义为唯一的,那么SQL Server将使用一个聚簇索引值及一个唯一值。一定要将聚簇索引定义为唯一的——如果它们实际上就是唯一的——因为它会带来更小的聚簇索引/非聚簇索引。如果我们的唯一聚簇索……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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操作)。记录更新必须首先写入聚簇索引数据行。然后,将对非聚簇索引进行更新以使它们可写。
作者
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的能源管理》等。
相关推荐
-
云端SQL Server高可用性最佳做法
与内部部署相比,在云端运行SQL Server可为数据库软件用户提供更多的灵活性和可扩展性,也可能更省钱。但云 […]
-
绘制数据关系图的利器:SQL Server 图像数据库工具
SQL Server 2017新增了图形数据库功能,你可以使用图结构来表示不同数据元素之间的关系。
-
如何在Azure部署时选择合适的SQL Server?
想要在Azure上运行SQL Server,企业一般会面临两种选择:在Azure虚拟机上安装SQL Server或使用Azure SQL Database。
-
Linux支持的引入 推动了SQL Server 2016集成服务的发展
随着SQL Server的不断发展,集成服务也在发生相应的变化。在最新的SSIS更新中,增加Linux支持和SQL Server 2016升级向导。