1

是否可以创建不唯一的非聚集索引?使用什么数据结构来实现非聚集索引。

4

2 回答 2

4

假设您正在谈论 SQL Server,那么UNIQUE在创建索引时不要指定。

CREATE /*UNIQUE*/ NONCLUSTERED INDEX IX ON T(C)

正如UNIQUE上面注释的那样,这不会强制C列的唯一性。但实际上,通过将(唯一)行定位器添加到非聚集索引键中,它仍然会在幕后变得唯一。

关于数据结构,聚集索引和非聚集索引都是B+ 树

于 2013-08-06T10:29:50.657 回答
1

正如 Martin Smith 所说,索引不需要在逻辑上是唯一的,但在实践中,SQL Server 添加了一个 4 字节的“唯一性”列来保证物理唯一性。

在结构差异方面,非聚集索引包括指向聚集索引的指针或堆指针(如果您尚未创建聚集索引)。

您应该注意,虽然它们都是 B 树,但还有其他区别 - 非聚集索引的叶节点高 1 级,这可能意味着从非聚集索引读取比从提供数据的聚集索引读取更快required 在叶节点中可用(所需的列在索引的键中)。

这是联机丛书中的聚集索引结构:

聚集索引结构

http://technet.microsoft.com/en-us/library/ms177443(v=sql.105).aspx

这是非聚集索引结构:

非聚集索引结构

http://technet.microsoft.com/en-gb/library/ms177484(v=sql.105).aspx

因此,从“覆盖的”非聚集索引读取可能会更快,因为每个级别都会读取 1 页,因此因为非聚集索引访问数据的级别更少,那么您将产生更少的逻辑读取,这反过来意味着更少物理磁盘读取和更少的 CPU 工作。

您还应该考虑仅使用特定查询所需的特定列覆盖索引将意味着需要读取的总页数更少以获取所有数据,从而提高性能,但也要注意,您拥有的索引越多,您的成本就越高会产生写入。

于 2013-08-06T13:09:00.410 回答