聚集索引基于数据行的键值在表内排序和存储这些数据行, 每个表只能有一个聚集索引, 因为数据行本身只能按一个顺序存储. 有关聚集索引体系结构的详细信息, 请参阅 聚集索引结构.

每个表几乎都对列定义聚集索引来实现下列功能:

  • 可用于经常使用的查询.

  • 提供高度唯一性. 创建 PRIMARY KEY 约束时, 将在列上自动创建唯一索引. 默认情况下, 此索引是聚集索引, 但是在创建约束时,可以指定创建非聚集索引.
  • 可用于范围查询.

如果未使用 UNIQUE 属性创建聚集索引, 数据库引擎将向表自动添加一个 4 字节的 uniqueifier 列. 必要时, 数据库引擎将向行自动添加一个 uniqueifier 值以使每个键唯一, 此列和列值供内部使用, 用户不能查看或访问.


查询注意事项

在创建聚集索引之前, 应先了解数据是如何被访问的. 考虑对具有以下特点的查询使用聚集索引:

  • 使用运算符(如 BETWEEN、>、>=、< 和 <=)返回一系列值.

    使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行物理相邻. 例如, 如果某个查询在一系列销售订单号间检索记录, SalesOrderNumber 列的聚集索引可快速定位包含起始销售订单号的行, 然后检索表中所有连续的行, 直到检索到最后的销售订单号.

  • 返回大型结果集.

  • 使用 JOIN 子句; 一般情况下, 使用该子句的是外键列.

  • 使用 ORDER BY 或 GROUP BY 子句, 在 ORDER BY 或 GROUP BY 子句中指定的列的索引, 可以使数据库引擎不必对数据进行排序,因为这些行已经排序, 这样可以提高查询性能.

列注意事项

一般情况下, 定义聚集索引键时使用的列越少越好, 考虑具有下列一个或多个属性的列:

  • 唯一或包含许多不重复的值

    例如, 雇员 ID 唯一地标识雇员. EmployeeID 列的聚集索引或 PRIMARY KEY 约束将改善基于雇员 ID 号搜索雇员信息的查询的性能. 另外, 可对LastNameFirstNameMiddleName 列创建聚集索引, 因为经常以这种方式分组和查询雇员记录, 而且这些列的组合还可提供高区分度.

  • 按顺序被访问

    例如, 产品 ID 唯一地标识 AdventureWorks2008R2 数据库的 Production.Product 表中的产品. 在其中指定顺序搜索的查询(如 WHERE ProductID BETWEEN 980 and 999)将从 ProductID 的聚集索引受益, 这是因为行将按该键列的排序顺序存储.

  • 由于保证了列在表中是唯一的, 所以定义为 IDENTITY.

  • 经常用于对表中检索到的数据进行排序.

    按该列对表进行聚集(即物理排序)是一个好方法, 它可以在每次查询该列时节省排序操作的成本.

聚集索引不适用于具有下列属性的列:

  • 频繁更改的列

    这将导致整行移动, 因为数据库引擎必须按物理顺序保留行中的数据值. 这一点要特别注意, 因为在大容量事务处理系统中数据通常是可变的.

  • 宽键   宽键是若干列或若干大型列的组合. 所有非聚集索引将聚集索引中的键值用作查找键, 为同一表定义的任何非聚集索引都将增大许多, 这是因为非聚集索引项包含聚集键, 同时也包含为此非聚集索引定义的键列.

设置索引选项

创建聚集索引时, 可指定若干索引选项, 因为聚集索引通常都很大, 所以应特别注意下列选项:

  • SORT_IN_TEMPDB

  • DROP_EXISTING

  • FILLFACTOR

  • ONLINE

有关详细信息,请参阅 设置索引选项.

SQL点点滴滴_聚集索引设计指南-转载的更多相关文章

  1. SQL点点滴滴_唯一索引设计指南-转载

    唯一索引能够保证索引键中不包含重复的值, 从而使表中的每一行从某种方式上具有唯一性, 只有当唯一性是数据本身的特征时, 指定唯一索引才有意义. 例如, 如果您希望确保 HumanResources.E ...

  2. SQL点点滴滴_非聚集索引设计指南-转载

    非聚集索引包含索引键值和指向表数据存储位置的行定位器. 有关非聚集索引体系结构的详细信息, 请参阅 非聚集索引结构. 可以对表或索引视图创建多个非聚集索引. 通常, 设计非聚集索引是为改善经常使用的没 ...

  3. SQL查询优化:详解SQL Server非聚集索引(转载)

    本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...

  4. 探究SQL添加非聚集索引,性能提高几十倍之谜

    上周,技术支持反映:客户的一个查询操作需要耗时6.1min左右,在跟进代码后,简化了数据库的查询后仍然收效甚微.后来,技术总监分析了sql后,给其中的一个表添加的一个非聚集索引(三个字段)后,同样的查 ...

  5. T-SQL查询高级--理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤

      写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完.这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章 ...

  6. SQL点点滴滴_查询类型和索引-转载

    当您考虑是否要对列创建索引时, 请估计在查询中使用列的方式, 下表介绍了索引对其有用的查询类型. 表中的示例基于 AdventureWorks2008R2 示例数据库, 在 SQL Server Ma ...

  7. 但从谈论性能点SQL Server选择聚集索引键

    简单介绍 在SQL Server中,数据是按页进行存放的.而为表加上聚集索引后,SQL Server对于数据的查找就是依照聚集索引的列作为keyword进行了. 因此对于聚集索引的选择对性能的影响就变 ...

  8. SQL Server的聚集索引和非聚集索引

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

  9. SQL Server-聚焦聚集索引对非聚集索引的影响(四)

    前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没有任 ...

随机推荐

  1. vue 路由传参 、接收参数

    传参组件 一. <router-link :to='"/main/course?navName=" +item.columnName + "&id=&quo ...

  2. jumserver 官方文档和

      一步一步安装(CentOS) 本文档旨在帮助用户了解各组件之间的关系, 生产环境部署建议参考 进阶安装文档 安装过程中遇到问题可参考 安装过程中常见的问题 测试推荐环境 CPU: 64位双核处理器 ...

  3. Python学习 day10

    一.默认参数的陷阱 先看如下例子: def func(li=[]): li.append(1) print(li) func() func() func(li=['abc']) func() 结果: ...

  4. uipath接入Python

    安装UiPath.Python.Activities,然后会有五个.Activities,他们的功能分别如下: 本人原创,转发或引用请注明出处.

  5. SQL语句模糊查询年月

    <if test="uploadTime != null" > <![CDATA[ and date_format(w.upload_time, '%Y%m') ...

  6. 【转】selenium自动化测试用例需要关注的几点(一)

    自动化测试设计简介  注:参看文章地址 我们在本章提供的信息,对自动化测试领域的新人和经验丰富的老手都是有用的.本篇中描述最常见的自动化测试类型, 还描述了可以增强您的自动化测试套件可维护性和扩展性的 ...

  7. 对Map的一些总结

    1:Map接口. Collection体系中存储的是单个元素,单身汉,而Map中存储的是2个元素,存储的是成对的元素. Map和Collection是没有联系的!!不要以为Map是Collection ...

  8. Linux下jdk安装过程

    注意:rpm 与软件相关命令 相当于 window 下的软件助手 管理软件 1 查看当前 Linux 系统是否已经安装 java 1)在命令窗口输入,可以查看系统自带的OpenJDK版本信息. jav ...

  9. unity2018的坑点

    发布后有的电脑无法运行exe程序(反正我的电脑不行) 删除发布出来的一个叫UnityCrashHandler64.exe即可运行

  10. nginx配置服务器负载均衡

    upstream servers { ip_hash; #hash,ip轮训 server localhost:8400; } server { listen 80; server_name loca ...