我有一个按月划分的大型表(700 亿行)
它有2个索引
- deviceId、logDateTime、eventId、id 上的聚集索引(唯一)
- id 上的非聚集索引(唯一)- 主键
第一个聚集索引与分区对齐,第二个非聚集主键在主文件组上不对齐
我想将第二个非聚集索引与分区对齐,以便轻松截断分区数据等。
根据我读到的内容,我需要删除索引并重新创建它,我可以先创建它,然后删除旧索引并将新索引设置为主键吗?
我正在寻找一种停机时间最少/无停机时间的解决方案,因为它是 24/7 数据库
SQL Server 2017 企业版
当前的不良指数是
ALTER TABLE [dbo].[LogData] ADD CONSTRAINT [PK_LogData] PRIMARY KEY NONCLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 99) ON [PRIMARY]
GO
当我查看创建新索引时,我要么有一个文件组,要么有一个分区方案,如果我选择分区方案,则只有一个名为PartitionByMonthScheme的分区方案,它只允许我选择日期时间作为列,这会生成以下内容
CREATE UNIQUE NONCLUSTERED INDEX [ix_newindex_id] ON [dbo].[LogData]
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PartitionByMonthScheme]([LogDateTime])
我假设这是正确的,在我这样做之后,它会将新索引与分区对齐吗?然后我必须删除旧的 PK 索引并使这个新索引成为主键?
或者我应该首先取消主键的链接,然后将主键创建索引作为一项操作?
对于实现上述目标的建议和帮助将不胜感激。谢谢
对齐意味着表(这里是聚集索引)和所有非聚集索引必须使用相同的分区方案或基于相同分区函数的分区方案进行分区。这可确保分区边界相同,以允许分区级操作,例如
TRUNCATE
或SWITCH
。您遇到的问题是分区列必须是分区主键(以及分区唯一索引和唯一约束)的键列。因此,您需要添加
logDateTime
主键才能对齐表/索引。在您去那里之前,我建议您首先验证主键是否确实需要/使用。日志表通常不是关系模型的一部分,因此不需要主键(尽管根据我的经验,在野外很常见)。如果这是您的情况,只需删除 PK 即可对齐表格。
假设应用程序不需要
id
单独使用主键,您可以创建一个新的唯一索引(或唯一约束)id
,logDateTime
然后删除旧的主键,如下所示。如果您必须单独使用主键,则对齐不是一个选项
id
。