相关疑难解决方法(0)

为什么我的Azure SQL数据库索引仍然是碎片?

我公司一直致力于使用我们Azure的SQL数据库表的GUID作为主键的罪(它实际上是比这更糟糕:我们使用VARCHAR(36),而不是唯一标识符).因此,我们最终得到碎片索引.它们看起来像这样:

CREATE TABLE OldTable (
  Id VARCHAR(36) PRIMARY KEY CLUSTERED NOT NULL DEFAULT NEWID(),
  CreateTime DATETIME2 NOT NULL,
  ...
)
Run Code Online (Sandbox Code Playgroud)

我通过创建新表"修复"了这个问题.这一次,我为CLUSTERED INDEX使用了一个不可变的,不断增加的DATETIME2(例如CreateTime)列,并将VARCHAR(36)保持为PRIMARY KEY,但这次是NONCLUSTERED.像这样:

CREATE TABLE NewTable (
  Id VARCHAR(36) PRIMARY KEY NONCLUSTERED NOT NULL DEFAULT NEWID(),
  CreateTime DATETIME2 NOT NULL INDEX IX_NewTable_CreateTime CLUSTERED,
)
Run Code Online (Sandbox Code Playgroud)

然后我使用INSERT INTO NewTable SELECT*FROM OldTable将旧表中的行"复制"到新表中.最后,我重命名表并删除旧表.生活似乎很好.

令我惊讶的是,几周之后,我发现NewTable有许多碎片索引,平均碎片率高达80%!甚至IX_NewTable_CreateTime也报告了18%的碎片.

INSERT INTO是否将索引分散?请问REBUILD指数能解决问题吗?

sql-server azure clustered-index azure-sql-database

0
推荐指数
1
解决办法
2274
查看次数