什么是索引,非聚集索引可以是非唯一的?

时间:2010-09-27 03:27:04

标签: sql sql-server tsql indexing terminology

回答我的问题[1]:

(MS SQL Server)索引的所有定义(我可以找到)都是模棱两可的,基于它的所有解释都使用未定义或含糊不清的术语来叙述某些内容。
索引的定义是什么?

例如,wiki(http://en.wikipedia.org/wiki/Index_(database))中最常见的索引定义:

  • 1)“数据库索引是一种数据结构,它以提高写入速度和增加存储空间为代价提高数据库表上数据检索操作的速度。可以使用数据库表的一列或多列创建索引。 ..“
  • 2)“SQL服务器默认在主键上创建聚簇索引[1]。数据以随机顺序存在,但逻辑排序由索引指定。数据行可以随机分布在整个表中。非聚集索引树按排序顺序包含索引键,索引的叶级包含指向页面的指针和数据页中的行号“

嗯,这是模棱两可的。人们可以在索引下理解:

  • 1)有序数据结构,树,包含中间节点和叶节点;
  • 2)叶节点数据包含来自索引列的值+“指向页面的指针和数据页中的行号”

考虑到2),非聚集索引是否可以是非唯一的?或者,甚至,1)?
对我来说似乎不是......

但TSQL是否意味着存在非唯一的非聚集索引?

如果是,那么“CREATE INDEX(Transact-SQL)”[2]中的非聚集索引以及在那里应用UNIQUE参数的内容是什么?

是吗:

  • 3)包含索引列值的叶节点数据?即如2)但没有指针+行号)?

如果是3),那么问题1)又出现了 - 为什么要将约束应用于“索引”中的实际数据复制,而不是现场实际数据?


更新:
书签(指针+行号)不是唯一的真实数据行(唯一标识行)吗? 这个书签不构成索引的一部分,从而使索引唯一吗?
你能给我一个索引的定义,而不是解释如何使用它UNDEFINED?后一部分我已经知道(或者可以自己读)。


[1]
“INDEX创造的独特论点 - 有什么用?”
UNIQUE argument for INDEX creation - what's for?

[2]
[CREATE INDEX(Transact-SQL)]
http://msdn.microsoft.com/en-us/library/ms188783.aspx

2 个答案:

答案 0 :(得分:19)

索引是一种旨在优化查询大型数据集的数据结构。因此,目前尚未声明任何事物是否独特。

你绝对可以拥有非唯一的非聚集索引 - 你怎么能在lastname,firstname上做索引?这从不将是独一无二的(例如在Facebook上.....)

您可以将索引定义为唯一 - 这只会向其添加额外检查,以确保不允许重复值。如果您要在(姓氏,名字)UNIQUE上建立索引,那么在您的网站上注册的第二个Brad Pitt就无法这样做,因为该唯一索引会拒绝他的数据。

任何给定表上的主键都有一个例外。主键是用于唯一且精确地标识数据库中每一行的逻辑标识符。因此,它必须对所有行都是唯一的,并且不能包含任何NULL值。

SQL Server中的聚簇索引的特殊之处在于它们确实包含叶节点中的实际数据。到目前为止没有任何限制 - 但是:聚集索引也用于唯一地定位(物理定位)数据库中的数据,因此,聚簇索引必须是唯一的 - 它必须是能够分别说出布拉德皮特#1和布拉德皮特#2。如果您不小心并为聚簇索引提供一组唯一的列,SQL Server将向那些不唯一的行添加“uniquefier”(4字节INT),例如:你会得到BradPitt001和BradPitt002(或类似的东西)。

聚集索引用作SQL Server表中实际数据行的“指针”,因此它也包含在每个非聚集索引中。因此,(lastname,firstname)上的非聚集,非唯一索引不仅包含这两个字段,而且实际上它还包含该表上的聚簇键 - 这就是为什么它很重要SQL Server表上的群集密钥很小,稳定且唯一 - 通常是INT。

因此,(lastname,firstname)上的非聚集索引将具有(lastname,firstname,personID),并且将包含(Pitt, Brad, 10176)(Pitt, Brad, 17665)等条目。当您在非聚集索引中搜索“Brad Pitt”时,SQL Server现在将找到这两个条目,对于这两个条目,它具有“物理指针”,可以找到这两个人的其​​余数据的位置,因此如果您要求的不仅仅是名字和姓氏,SQL Server现在可以获取两个Brad Pitt条目中的每一个的整行,并为您提供查询所需的数据。

答案 1 :(得分:0)

索引的定义是维基百科定义的第一部分“数据库索引是一种数据结构,它以提高写入速度和增加存储空间为代价提高数据库表上数据检索操作的速度。”

然后您将唯一索引作为一种特殊索引,以确保索引值是唯一的。

如何实施......取决于DBMS。 但它不会改变索引或唯一索引的定义。

作为一个实现细节,MS SQL允许非集群(通常类型,它是一个树,指向单独空间中的实际行内容,编号为2),并且是聚簇的(其中存储行的行)索引,根据索引值,编号1.)索引。

因此,一个非唯一的非聚集索引就是(conceptualy)一个值树,对于每个值,都有一组指向包含该值的表行的指针。

相关问题