2015-10-06 96 views
8

由於PostgreSQL不支持聚簇索引,因此我正在考慮MSSQL服務器。我讀過article比較聚集索引和非聚集索引。這篇文章的要點是,(強調雷):瞭解聚簇索引

非聚集索引店都值和指針實際 一行認爲值。

而且

聚簇索引並不需要存儲一個指針,以實際行 因爲在表中的行存儲在磁盤上 相同的確切順序的事實作爲聚集索引

據我所知,therethere這是非常難以支持物理對錶格數據進行排序,特別是在表格被分成多個驅動器的情況下。而現在,我認識到聚集索引概念,假設數據以物理順序存儲。這就是我所困惑的。

問題:什麼是聚簇索引結構?它是否支持tree-like結構遍歷,如PosgtreSQL確實爲btree索引嗎?

+3

所以,你要和PostgreSQL遷移到MS SQL服務器只是爲了讓聚集索引?!? – jarlh

+0

@jarlh不完全是,我只是想通過'MSSQL'例子來說明這個概念。特別是,如果聚集索引只是物理排序數據(以某種方式),它就會很清楚。但是,我怎樣才能配合btree結構和物理秩序。我無法想象它實施的任何方式...... –

+0

有什麼點讓你跳動?數據可以被排序的想法,或者行的數據可以成爲索引的一部分? –

回答

4

在SQL Server中,索引被組織爲B樹。索引B樹中的每個頁面都稱爲索引節點。 B樹的頂層節點稱爲根節點。索引中底層的節點稱爲葉節點。根節點和葉節點之間的任何索引級別統稱爲中級級別。在聚集索引中,葉節點包含基礎表的數據頁面。根級和中級級節點包含包含索引行的索引頁。每個索引行都包含一個鍵值和一個指向B樹中的中間級別頁面的索引,或索引葉級別中的數據行。索引每個級別的頁面都鏈接在一個雙向鏈接列表中。

集羣索引在sys.partitions中有一行,索引使用的每個分區的index_id = 1。默認情況下,聚簇索引具有單個分區。當聚簇索引具有多個分區時,每個分區都有一個包含該特定分區數據的B樹結構。例如,如果聚簇索引有四個分區,則有四個B樹結構;每個分區一個。

for ref。

https://technet.microsoft.com/en-us/library/ms177443(v=sql.105).aspx http://www.sqlservercentral.com/blogs/practicalsqldba/2013/03/14/sql-server-part-4-explaining-the-non-clustered-index-structure-/

+0

因此,除了phisically有序的表,我們有索引 - 行(Root和intermidiate-level)真正遍歷到物理行由執行,對吧? –

+0

那麼你是說只有一個分區的聚集索引沒有B-Tree? – Brain2000

1

聚簇索引有三個層次

1.Root水平

2.Intermediate水平

3.Leaf水平

聚集索引中包含葉級別的數據行。 如果您在索引列中搜索值,查詢引擎將首先查看根級別的值(如果該值在根級別可用),那麼查詢引擎將不會進入中間級別或葉級別。如果該值不是建立在根級別上,則它將搜索中級或葉級別的值。 如果數據行數量太小,那麼在聚簇索引中沒有可用的中間級別。

下面的圖表可以幫助你理解聚集索引的基礎:

clustered index