我听说只有一个聚类索引吗?我可能错了,但我确定我在某个地方读书。

在我的SQL Server 2005表中,我有以下列:

连续纳姆 -------大键---------主要钥匙

-------- nvarchar(50)

原型 ------ nvarchar(50)

当我使用SQL Server Management Studio以设计模式打开表格时,我注意到 聚类索引 属性已启用 , ,而它被禁用 原型.

如果只有一个集群索引,那么为什么当地区在 连续纳姆 已经定义为主要键吗?

如果可以有更多集群索引,那么如何启用此属性 原型 柱子?

有帮助吗?

解决方案

主钥匙和群集索引是两件不同的东西,尽管它们通常是通过结合使用的。您的桌子最终以这种方式出现了一些潜在的原因:

(a)它可能是用一个 非聚类 主要键使用 PRIMARY KEY NONCLUSTERED, ,然后添加聚类索引。

(b)可以添加群集索引,然后添加了主要键(在这种情况下,由于已经有一个群集索引,因此无法群集)。

这些都可能是故意的设计决策,事故,事后发生的变化等。

忽略管理工作室的设计视图中的属性。聚类索引 该表,但由指定的列定义。其他列在技术上仍然是群集索引的一部分,它们只是索引中的密钥列。称之为“启用/禁用”是误导性的。

其他提示

可以只有一个群集索引,因为群集索引是表数据本身。这是一种基于聚类键组织表数据的方式。它类似于Oracle的索引有组织的表(IoT)。非聚类索引是单独的数据结构。聚类索引是组织本身作为B树的数据。

默认情况下,SQL Server将主键作为群集索引,如果还没有。看来,在您的情况下,主键是作为“非聚类索引”而创建的,将列区作为“群集索引”创建。

每个表只能有一个群集索引。主键不是聚类索引。回答您的问题:

如果只有一个聚类索引,那么为什么当SerialNum已定义为主要密钥时,为什么区域启用了该属性? 这是因为聚类索引是在地区创建的。只有这将显示为启用,其余的将显示为残疾人。

如果可以有更多的群集索引,那么如何启用此属性的示意图列? 您不能在表上有一个以上的群集索引。您将不得不在区域上放下聚类索引,并为示意图重新创建一个索引。如果您仍然想在区域保留群集索引,那么您可以使用的一个技巧是创建索引视图,然后在示意图的视图上创建群集索引。您可能需要企业版。

  • 从您使用的其他帖子中可以看到的MySQL中,主键和群集索引始终相同。
  • 在SQL Server中,它们可能不同。
  • 在SQL Server中,只能有一个群集索引。聚类索引将确保根据该索引对表进行物理排序。
  • 当然,除了您的一个群集索引外,您还可以拥有许多非聚类索引,通常您会在某些表上有一个或几个非聚类索引。
  • 通常,在SQL Server中,主键具有群集索引(我认为这是默认值),但是可以使用群集索引配置另一列(或列)。
  • 甚至可以在该群集索引中具有两个或更多列。您不要说串行列是否也被聚集,但是如果您看到两者都聚集在一起,那么您就有一个跨度两个列的索引,并且会有一个群集订单整数属性列确定物理表布局(例如,“由区域首先订购,在区域内,按SerialNum订购”)。请注意,在此群集索引中添加更多列会降低性能,而不是改善绩效,除非物理订购完全匹配主要查询案例与该表格,以克服确保物理订购所带来的减少插入性能罚款。
  • 在您的系统中,如果该地区被聚集(但不是序列纳姆),那么如果对该表的疑问更频繁地与“区”或“区域”过滤,那可能是一个好的设计,而不是“ serialnum”。 (我在类似SerialNum之类的方案中看到了这种事情,是一种自动插入的替代密钥,在您的数据模型中其他地方没有使用过,并且最终用户/应用程序/报告是否有JOINS/WHERE/GROUPBY/与地区的订购条款,但很少或永远不会反对Serialnum。)
许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top