2015-10-06 113 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