这句话是什么意思:聚集索引物理存储在表中?

时间:2010-02-15 13:17:42

标签: sql-server indexing clustered-index

群集索引如何存储在硬盘上?什么是逻辑顺序?

非聚集索引如何工作?

6 个答案:

答案 0 :(得分:21)

这意味着表中的数据根据​​B-Tree(或聚类列)的顺序存储在CLUSTERED PRIMARY KEY中。

这个名字在我看来有点令人困惑。 Oracle中的相同概念称为index-organized table,我发现它更具描述性。

非聚集索引包含索引列的值以及指向它们源自的记录的指针。

“聚集索引”是表本身; “非聚集”索引是某些表列的有序副本。

如果“创建”聚簇索引,则会重新排列表。这就是为什么你不能在一张桌子上拥有多个“聚集索引”的原因:这个表不能以多个顺序排列。

如果创建辅助索引,则会创建表的卷影副本,其中包含索引列的值和指向它们的记录的指针。每当表格改变时,副本也会改变(引擎会自动处理)。

非群集表

id   col1   value
--   --     --
1    1      Data 1
6    1      Data 6
3    1      Data 3
7    2      Data 7
9    2      Data 9
5    2      Data 5

该表未订购。

集群表

id   col1   value
--   --     --
1    1      Data 1
3    1      Data 3
5    2      Data 5
6    1      Data 6
7    2      Data 7
9    2      Data 9

该表在id上订购。

具有二级索引的聚簇表

Table                      Index
id   col1   value          col1   id
--   --     --             --     --
1    1      Data 1         1      1
3    1      Data 3         1      3
5    2      Data 5         1      6
6    1      Data 6         2      5
7    2      Data 7         2      7
9    2      Data 9         2      9

该表是id上的订货人,索引是在(col1, id)订购的

答案 1 :(得分:4)

对于非聚簇索引,会创建一个单独的文件,该文件仅包含索引字段,该字段将其记录放在逻辑索引顺序中。对于聚簇索引,没有单独的文件 - 表本身(所有字段)中的数据按索引的逻辑顺序放置。

这使得对索引的查找更快(尽管它确实是最好的索引,比如你将查找范围的日期)。如果将记录插入中间,它也会使插入速度变慢。

答案 2 :(得分:3)

聚集索引存储

聚簇索引从根本上与所有其他索引的工作方式完全相同 - 它们存储在称为B-Tree的结构的变体中。它们存储在相同的文件中,格式与SQL Server中的所有其他表格相同。

概念

退一步思考您正在编制索引的数据。 (我希望你能想到这本书中的一本书)。如果除了在本书末尾有索引之外,您还订购了书中的数据,该怎么办?您可以更快地查找信息。以电话簿为例,其中所有数据均按姓氏和名字排序。您无需到电话簿的背面查找某人的电话号码。与历史书相比,你必须到书后面的索引找到你想要的东西。

逻辑上,聚集索引(或Oracle中的“索引组织表”) 您的数据,但已排序。物理上,B树的叶节点按排序顺序包含所有表的数据。当您在连续范围(例如日期范围)上扫描表格中的数据时,这非常有用。

关于聚簇索引的另一个重要事项(至少在SQL Server中)是您的聚类列(即构成聚簇索引排序方式的列)包含在您在其上定义的每个非聚簇索引的末尾。表。这样可以非常快速地搜索 您的群集列,这在OLAP数据库中通常是非常需要的。

非聚集索引

您的表格只能存储在一个物理订单中。但有时您需要以其他方式查找数据。对于这些方案,您使用非聚集索引。这也是作为B树实现的,但它与表的数据顺序没有任何关系,就像聚簇索引一样。这意味着如果您希望表中的数据未包含在非聚集索引中,则SQL Server必须在物理上查找表中的数据才能获得所需内容。这是另一项操作,对于许多查询来说可能成本很高,并且在优化表时是一个关键的设计考虑因素。

一句话

你可以写一本关于这些东西的书。很多人都有。如果我已经厌倦了你,请查看维基百科的B-Tree页面。从那里开始。如果您仍然(真的)感兴趣,我建议实际编程一个简单的B树,以便您可以看到所涉及的内容。而且,如果您想更深入地了解完全 SQL Server如何存储所有这些内容,请查看Kalen Delaney的Inside SQL Server: The Storage Engine。所有这些都是过度杀戮吗?那是给你决定的。但是你学习的越多,你对DB开发的熟悉程度就越高,你的系统就会越快。我保证。

答案 3 :(得分:2)

这意味着聚簇索引确定了实际存储表中记录的物理顺序。非聚集索引只是单独存储的键值列表,可以按照除聚类/物理排序之外的其他顺序进行快速查找。

快速示例:包含ID(主键)的表格,FirstNameLastNameCar包含三个人:0 = Stig(Llana),1 = Jeremy Clarkson(DB9),2 = Richard Hammond(911),3 = James May(Lambo)和LastName上的聚簇索引以及Car上的非聚集索引将存储实际的数据行在磁盘上的物理顺序表中:

ID FirstName LastName Car
1  Jeremy    Clarkson DB9
2  Richard   Hammond  911
3  James     May      Lambo
0  The       Stig     Llana

非聚集索引也会存储如下内容:

Car   ID
911   2
DB9   1
Lambo 3
Llana 0

答案 4 :(得分:0)

表示该表按聚簇索引的指定顺序排序。非聚集索引是物理存储的。

答案 5 :(得分:-3)

主索引在技术上不是“聚簇”索引,但两者都会导致对数据进行物理排序。他们的名字显而易见。主索引处理主键。意思是,每个主键必须是唯一的(否则它不是主键)。聚类索引处理任何非主键的内容,并且根据定义,可以允许它是非唯一的。这就是“集群”这个词的来源。如果您对非主要数据进行排序,则表示它可以重复。当重复数据一起出现时,它被视为“群集”。