【发布时间】:2013-08-07 06:52:07
【问题描述】:
是否可以创建非唯一的非聚集索引?使用什么数据结构来实现非聚集索引。
【问题讨论】:
-
请指定您所说的关系型数据库。
标签: sql-server indexing non-clustered-index
是否可以创建非唯一的非聚集索引?使用什么数据结构来实现非聚集索引。
【问题讨论】:
标签: sql-server indexing non-clustered-index
假设您在谈论 SQL Server,那么在创建索引时不要指定 UNIQUE。
CREATE /*UNIQUE*/ NONCLUSTERED INDEX IX ON T(C)
由于UNIQUE 在上面被注释掉,这不会强制C 列的唯一性。但实际上it will still be made unique behind the scenes 通过将(唯一)行定位符添加到非聚集索引键中。
关于数据结构,聚集索引和非聚集索引都是B+ trees。
【讨论】:
正如 Martin Smith 所说,索引不需要逻辑上唯一,但在实践中,SQL Server 添加了一个 4 字节的“唯一性”列来保证物理唯一性。
在结构上的区别,非聚集索引包括指向聚集索引的指针或者堆指针(如果你没有创建聚集索引的话)。
您应该注意,虽然它们都是 B 树,但还有其他区别 - 非聚集索引的叶节点高 1 级,这可能意味着从非聚集索引读取 可以比从聚集索引读取更快,前提是叶节点中提供所需的数据(所需的列在索引的键中)。
这是来自联机丛书的聚集索引结构:
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 的工作。
您还应该考虑到,仅使用特定查询所需的特定列来覆盖索引意味着需要读取的总页数更少以获取所有数据,从而提高性能,但也要注意,您拥有的索引越多,您的写入将产生更多成本。
【讨论】: