我有一个简单的表:
CREATE TABLE [dbo].[UserTestGroups](
[UserTestGroupId] [int] IDENTITY(1,1) NOT NULL,
[Token] [nvarchar](100) NOT NULL,
[TestId] [bigint] NOT NULL,
[Group] [tinyint] NOT NULL,
[InsertDate] [datetime] NOT NULL)
Run Code Online (Sandbox Code Playgroud)
该表将有相对大量的插入 - 最初 10,000 个会话,每个会话 8 行,每天总共 80,000 个插入。我们预计在不久的将来会显着增加。无论如何,我们努力使我们的平台尽可能具有弹性,而不仅仅是适应当前的负载。
该表将用于报告,可将其视为次要要求。
由于我们使用的是实体框架(Microsoft 的 ORM),因此所有写入的表都需要一个逻辑主键,因此我添加了一个我直接忽略的 Identity 列。我不喜欢使用复合键,它们往往会使 ORM 成为噩梦,所以除非我绝对必须这样做,否则我会添加另一个标识列并将其设为 PK。
所有 BI 报告的查询都将基于令牌,即sessionId - GUID,因此我在该token列上创建了聚集索引。
我们的 DBA 是 SQL Server MVP,他告诉我在 GUID 列上使用聚集索引会导致碎片,我应该在IDENTITY列上创建聚集索引,并为列创建非聚集索引Token。
不明白,非聚集索引会不会有同样的碎片问题?为什么将数据复制到新索引中比使用聚集索引更好?
token-Guid 不是 PK,PK 是所有列的组合(包括InsertDate)。
目前(因为我真的不知道是什么原因)所有 GUID 值都存储为NVARCHAR(100),我不知道这样做的历史原因是什么,但这就是我们所拥有的。
我们的DBA在海外,我们的沟通是一条推特长,所以在他回来之前我无法得到正确的答案
sql-server clustered-index identity fragmentation sql-server-2014