2013-08-06 153 views

回答

4

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

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

作为UNIQUE被注释了上述这对C列不强制唯一性。但实际上it will still be made unique behind the scenes通过将(唯一)行定位器添加到非聚集索引键中。

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

+0

什么数据结构被用来存储这样的索引? –

+0

@java_geek - B树。另请参见[非聚簇索引结构](http://technet.microsoft.com/zh-cn/library/ms177484(v = sql.105).aspx) –

1

正如马丁史密斯所说,索引不需要是逻辑唯一但实际上,SQL Server添加一个4字节的'uniquifier'列以保证物理唯一性。

根据结构差异,非聚簇索引包括指向聚簇索引或堆指针的指针(如果尚未创建聚簇索引)。

您应该注意到,虽然它们都是B树,但还是有其他差异 - 非聚簇索引的叶节点高1级,这可能意味着从非聚簇索引读取可能会比从提供所需数据的聚集索引在叶节点中可用(需要的列位于索引的关键字中)。

下面是从联机丛书聚集索引结构:

Clustered index structure

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

这里的非聚集索引结构:

Non-clustered index structure

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

因此,从'覆盖'非聚集索引读取可以更快,因为每个级别引起1个页面读取,因为非聚集索引具有更少的层次来获取数据,那么您将产生更少的逻辑读取意味着更少的物理磁盘读取和更少的CPU工作。

您还应该考虑,只包含特定查询所需的特定列的索引将意味着需要读取更少的总页数以抓取所有数据,从而实现更快的性能,但也要意识到您拥有的索引越多,写入的成本就越高。