为什么在几列而不是在其他列上启用了群集索引属性?
-
16-10-2019 - |
题
我听说只有一个聚类索引吗?我可能错了,但我确定我在某个地方读书。
在我的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。)