索引 - 聚集索引设计指南-转载

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

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

  • 可用于经常使用的查询.
  • 提供高度唯一性. 创建 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

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

时间: 2024-08-02 06:58:11

索引 - 聚集索引设计指南-转载的相关文章

SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 &lt;第八篇&gt;

聚集索引.非聚集索引.非聚集唯一索引 我们都知道建立适当的索引能够提高查询速度,优化查询.先说明一下,无论是聚集索引还是非聚集索引都是B树结构. 聚集索引默认与主键相匹配,在设置主键时,SQL Server会默认在主键列创建聚集索引.但是可以手动更改为在任意一个列创建聚集索引,然后在另一个字段或多个字段上定义主键.这时主键将会被作为一个唯一的非聚集索引(唯一索引)被创建.通过指定NONCLUSTERED关键字就可以做到. CREATE TABLE MyTableKeyExample { Colu

索引 - 非聚集索引设计指南-转载

非聚集索引包含索引键值和指向表数据存储位置的行定位器. 有关非聚集索引体系结构的详细信息, 请参阅 非聚集索引结构. 可以对表或索引视图创建多个非聚集索引. 通常, 设计非聚集索引是为改善经常使用的没有建立聚集索引的查询的性能. 与使用书中索引的方式相似, 查询优化器在搜索数据值时, 先搜索非聚集索引以找到数据值在表中的位置, 然后直接从该位置检索数据. 这使非聚集索引成为完全匹配查询的最佳选择, 因为索引包含说明查询所搜索的数据值在表中的精确位置的项. 例如, 为了从 Person.Perso

索引 - 唯一索引设计指南-转载

唯一索引能够保证索引键中不包含重复的值, 从而使表中的每一行从某种方式上具有唯一性, 只有当唯一性是数据本身的特征时, 指定唯一索引才有意义. 例如, 如果您希望确保 HumanResources.Employee 表的 NationalIDNumber 列中的值唯一, 当主键为 EmployeeID 时, 可以为 NationalIDNumber 列创建一个 UNIQUE 约束. 如果用户尝试在该列中为多个雇员输入相同的值, 将显示错误消息并且不能输入重复的值. 使用多列唯一索引, 索引能够保

主键,唯一索引 聚集索引的关系

为列创建索引实际上就是为列进行排序,以方便查询.建立一个列的索引,就相当与建立一个列的排序. 主键是唯一的,所以创建了一个主键的同时,也就这个字段创建了一个唯一的索引, 唯一索引实际上就是要求指定的列中所有的数据必须不同. 主键一唯一索引的区别: 1 一个表的主键只能有一个,而唯一索引可以建多个.         2 主键可以作为其它表的外键.         3 主键不可为null,唯一索引可以为null. 聚集索引:将表内的数据按照一定的规则进行排列的目录.正因为如此,一个表中的聚焦索引只有

MySQL的btree索引和hash索引&amp;聚集索引

1,BTREE是多叉树,多路径搜索树.有N棵子树的节点它包含N-1个关键字,例如,有3个子树的非叶子节点,那么就有2个关键字,每个关键字不保存数据,只用来存储索引(在索引存储数据时,将索引指向关键字的值也存储进来.最终实现key = &get; value结构).所有的数据最终都要落在叶子节点,所有的叶子节点包括关键字信息以及指向这些关键字的指针,而且叶子节点是根据关键字大小.顺序链接的.所有的叶子节点都必须有个链表指针把数据串起来.所以,所有非叶子节点可以看成索引部分,包括子树中最大值或最小值

04.索引-聚集索引(2) 堆表、聚集表、聚集索引结构

堆表中 1.没有聚集索引页 2.数据页中的数据都是无序的 聚集表中 1.数据页都是有序的,按照索引键列排序 2.索引页指向数据页,数据页本身也是聚集索引的一部分 3.数据页的IndexLevel为0,索引页依次为1 2 3 ...,最大的IndexLevel的索引页只有一个,即根

03.索引-聚集索引(1)

创建聚集索引并重新组织 CREATE UNIQUE CLUSTERED INDEX CIX_Employee001_Id ON Employee001(Id); ALTER INDEX CIX_Employee001_Id ON Employee001 REORGANIZE; 索引情况 SELECT database_id, index_id, index_type_desc, index_depth, index_level, page_count FROM sys.dm_db_index_p

SQL Server 索引 聚集索引、非聚集索引、堆

1.存储结构

数据库中的聚集索引、非聚集索引、优化索引

这篇文章我们来讨论一下索引的问题吧,这篇文章不会介绍怎么创建索引,但是会介绍怎么优化索引. 什么是索引? 索引是对记录按照多个字段进行排序的一种方式.对表中的某个字段建立索引会创建另一种数据结构,其中保存着字段的值,每个值又指向与它相关的记录.这种索引的数据结构是经过排序的,因而可以对其执行二分查找. 怎么理解索引呢?我们经常用在windows系统下,查询某些文件,系统都会建议我们建立文件的索引.比如,如果你要查询一个文件名,系统要扫描所有文件进行傻瓜式地扫描,速度当然会很慢.当我们建立了索引后