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

Gen*_*нин 9 sql t-sql sql-server 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的独特论证 - 有什么用?"
INDEX创建的UNIQUE参数 - 有什么用?

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

mar*_*c_s 21

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

你肯定可以拥有非唯一的非聚集索引 - 你怎么能在lastname,firstname上索引?这永远不会是独一无二的(例如在Facebook上.....)

您可以将索引定义为唯一 - 这只会向其添加额外检查,以确保不允许重复值.如果您将索引设置为(姓氏,名字)UNIQUE,那么在您的网站上注册的第二个布拉德皮特就不能这样做,因为该唯一索引会拒绝他的数据.

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

SQL Server中的聚簇索引的特殊之处在于它们确实包含叶节点中的实际数据.到目前为止没有任何限制 - 但是:聚集索引也用于唯一地定位(物理定位)数据库中的数据,因此,聚簇索引必须是唯一的 - 它必须能够告诉Brad Pitt#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条目中的每一个获取整行,并为您提供查询所需的数据.

  • 谢谢,但忽略:尽管引用了你,但我没有正确地阅读你最初所说的内容; 现在我拥有,它是完全合理的.道歉. (2认同)
  • 如果我是布拉德皮特,我会创建具有唯一名字/姓氏约束的 facebook,这样就不会有另一个布拉德皮特了。 (2认同)

pas*_*cal 0

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

然后你就有了唯一索引,作为一种特殊的索引,它确保索引值是唯一的。

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

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

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