我试图知道没有聚集索引的表被视为堆表,然后表中没有主键,它被称为??
。
如果两者都不存在那么它将被称为堆表。
主键将给出逻辑顺序,然后是聚集索引将给出的内容,或者它们都将执行相同的操作。
这不是学习我只是想知道深度潜水,但每个人都有自己的版本。所以我回到了我的社区专家那里。我已经对此做了很多阅读,所以请将其视为有效的问题。
答案 0 :(得分:1)
没有聚集索引的表是Heap Table
。 Heap Table
没有订单,行在插入时存储。
具有聚簇索引的表是Clustered table
。根据群集索引中包含的关键字段排列群集表。
创建主键时,如果不存在主键,则仅创建聚簇索引。还可以通过显式指定创建具有非聚簇索引的主键。
表格最多可以包含仅一个聚集索引。对于插入或更新行时的聚簇索引,将重新排列索引以维护索引中的顺序。
然而对于heap table
,插入或更新行而没有任何安排,即它们存储在SQL服务器可用于所述表的页面中。
希望这能清除你的一些疑问,随意要求任何清晰。
答案 1 :(得分:0)
主键是一种约束,当您创建主键时,它实际上会在后台创建聚簇索引以强制执行主键约束。
简单来说,A Primary实际上是表上的聚簇索引。
是的,当表上没有定义聚簇索引/主键时,它被称为HEAP。
创建一个没有主键列的表并检入SSMS,它将没有该表的约束或索引。
number.h
签入SSMS对象资源管理器:
现在创建此ID列A PRIMARY KEY,看看会发生什么:
CREATE TABLE Index_Test(ID INT NOT NULL)
GO
现在刷新SSMS中的表并展开所有节点以查看其中的内容:
我只添加了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
表,其中的列为ID
,Name
和Salary
。您可以在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
╚════╩══════════════╩═════════╝