我不打算在我的桌子上使用聚集索引,我会后悔吗?

Nor*_*ork 1 sql sql-server

为简单起见,假设我在Sql Server中有一个表'Car'.它有2列.'Id'是一个uniqueidentifier/Guid,是主键.'Name'是一个nvarchar/string.该数据库将用于一个轻微使用的应用程序,可能在10个并发用户达到峰值.'汽车'可能有数千行.它将定期查询,插入和更新.

我知道在Guid列上有一个聚簇索引通常很糟糕,因此我的计划是将表保留为堆并且没有聚簇索引.我在Id上有一个非聚集索引.

在这个非常简单的场景中,有什么理由我会后悔没有聚集索引吗?如果您同意,请解释您的答案背后的原因.我看过帖子,人们会说"我要添加一个int列只是为了添加一个聚簇索引".我无法弄清楚为什么有人会这样做,如果你不计划反对int列,无论如何,它增加了什么价值?

同样对于此示例,请假设newsequentialid()不是一个选项.我首先使用实体​​框架模型,这是一个痛苦的使用(除非有人可以指出一个简单的方法,我错过了).还假设Guid PK是一项要求(它是现有系统).

Aar*_*and 8

使用GUID作为主键时,大量插入将导致索引中的页面拆分.糟糕的页面分割,这也导致碎片化.您可以使用更宽松的填充因子推迟其中一些,但这仍然只是推迟,并迫使您在此期间使用更多空间.

当一个IDENTITY列被聚类时,假设你没有重新种植或使用SET IDENTITY_INSERT ON它,它会强制新的插入到表的末尾,从而消除了这些页面拆分.(可以说这会导致一个不同的问题 - "插入热点" - 但是有1000行我不认为这将是一个主要问题.)

如果表中没有聚簇索引,您可能会打开涉及转发行的性能问题.

如果您与GUID绑定,则应考虑NEWSEQUENTIALID()避免这些问题,并在此上进行集群.如果您没有绑定GUID,则应考虑使用IDENTITY而不是 GUID,并考虑群集.除了避免基表上的页面拆分之外,我没有看到没有聚簇索引的好处.