2013-08-06 187 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工作。

您還應該考慮,只包含特定查詢所需的特定列的索引將意味着需要讀取更少的總頁數以抓取所有數據,從而實現更快的性能,但也要意識到您擁有的索引越多,寫入的成本就越高。