没有聚簇索引的表被视为堆表?

时间:2015-09-05 01:54:17

标签: sql sql-server

我试图知道没有聚集索引的表被视为堆表,然后表中没有主键,它被称为??。 如果两者都不存在那么它将被称为堆表。  主键将给出逻辑顺序,然后是聚集索引将给出的内容,或者它们都将执行相同的操作。

这不是学习我只是想知道深度潜水,但每个人都有自己的版本。所以我回到了我的社区专家那里。我已经对此做了很多阅读,所以请将其视为有效的问题。

3 个答案:

答案 0 :(得分:1)

没有聚集索引的表是Heap TableHeap Table没有订单,行在插入时存储。

具有聚簇索引的表是Clustered table。根据群集索引中包含的关键字段排列群集表。

创建主键时,如果不存在主键,则仅创建聚簇索引。还可以通过显式指定创建具有非聚簇索引的主键。

表格最多可以包含仅一个聚集索引。对于插入或更新行时的聚簇索引,将重新排列索引以维护索引中的顺序。

然而对于heap table,插入或更新行而没有任何安排,即它们存储在SQL服务器可用于所述表的页面中。 希望这能清除你的一些疑问,随意要求任何清晰。

答案 1 :(得分:0)

主键是一种约束,当您创建主键时,它实际上会在后台创建聚簇索引以强制执行主键约束。

简单来说,A Primary实际上是表上的聚簇索引。

是的,当表上没有定义聚簇索引/主键时,它被称为HEAP。

创建一个没有主键列的表并检入SSMS,它将没有该表的约束或索引。

number.h

签入SSMS对象资源管理器:

enter image description here

现在创建此ID列A PRIMARY KEY,看看会发生什么:

CREATE TABLE Index_Test(ID INT NOT NULL)
GO

现在刷新SSMS中的表并展开所有节点以查看其中的内容:

enter image description here

我只添加了Primary Key约束,但它实际上为我创建了一个Clustered Index。

答案 2 :(得分:0)

  

我试图知道没有Clustered Index的表被视为   堆表

这是正确的。

  

然后表中没有主键,它叫做??。

对于未定义主键的表,没有特殊或通用的名称。主键只是一个约束,您可以将其放在插入表中的数据上。它是可选的,您可以自行决定是否需要它。

  

如果两者都不存在,那么它将被称为堆表。

是。正确。表中缺少主键与任何方式无关。重要的是它是否具有聚簇索引。由于它没有聚集索引,因此它当然可以称为Heap Table

  

主键将提供逻辑顺序,然后是聚簇索引   给予或他们俩都会做同样的操作。

我从未听过这个词Logical Order w.r.t.在SQL Server中存储表的数据。但是有一个术语Physical Storage Order。主键决定与订购/存储相关的任何内容。主键只是一个约束,它为插入表中的每一行中的列强制执行唯一值,例如如果您在Employee表的ID列上设置了主键约束,则不能让两名员工具有相同的ID 1。如果不满足约束,它甚至可能导致无法将记录插入表中。

聚簇索引决定磁盘上表的行的Physical Storage Order。每当在表中添加/更新行以强制执行物理存储排序时,它还导致对应于行的数据的存储的改变。假设您有一个Employee表,其中的列为IDNameSalary。您可以在ID列上定义聚簇索引。所以这就是表的行将存储在磁盘上的方式:

╔════╦══════════════╦═════════╗
║ ID ║  Name        ║ Salary  ║
╠════╬══════════════╬═════════╣
║  1 ║ Jeff Atwood  ║  111    ║
║  2 ║ Geoff Dalgas ║  222    ║
║  3 ║ Jarrod Dixon ║  333    ║
║  4 ║ Joel Spolsky ║  444    ║
╚════╩══════════════╩═════════╝

现在您更新具有ID的记录2.您将其ID更改为5.如果Heap Table表上没有聚集索引(Employee),那么不需要重新排序数据存储。该行将就地更新。更新后的表行的最终快照如下所示:

╔════╦══════════════╦═════════╗
║ ID ║  Name        ║ Salary  ║
╠════╬══════════════╬═════════╣
║  1 ║ Jeff Atwood  ║  111    ║
║  5 ║ Geoff Dalgas ║  222    ║ <- No physical movement of the affected row
║  3 ║ Jarrod Dixon ║  333    ║
║  4 ║ Joel Spolsky ║  444    ║
╚════╩══════════════╩═════════╝

但是,如果您在ID列上定义了聚簇索引,则此故事会发生变化。将创建一个孔,其中存在ID 2的行。并且已更改ID 5的整行将移动到表格的底部,如下面的快照所示。此类更新会导致表存储碎片化,可以通过index reorganizing or index rebuilding解决:

╔════╦══════════════╦═════════╗
║ ID ║  Name        ║ Salary  ║
╠════╬══════════════╬═════════╣
║  1 ║ Jeff Atwood  ║  111    ║
║<HOLE causing fragmentation> ║
║  3 ║ Jarrod Dixon ║  333    ║
║  4 ║ Joel Spolsky ║  444    ║
║  5 ║ Geoff Dalgas ║  222    ║ <- Physical movement of the affected row
╚════╩══════════════╩═════════╝