是否可以创建一个非唯一的非聚集索引?使用什么数据结构来实现非聚簇索引。
答案 0 :(得分: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。
答案 1 :(得分:1)
正如Martin Smith所述,索引不需要逻辑唯一,但实际上,SQL Server添加了一个4字节的“uniquifier”列来保证物理唯一性。
就结构差异而言,非聚集索引包括指向聚簇索引或堆指针的指针(如果尚未创建聚簇索引)。
你应该注意,虽然它们都是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工作。
您还应该考虑仅使用特定查询所需的特定列来覆盖索引,这意味着需要读取的总页数越少,以获取所有数据,从而提高性能,但也要注意您拥有的索引越多,你的写作会产生更多的成本。