sql – 检查外键约束“在线”
如果我们有一个巨大的事实表并且想要添加一个新维度,我们可以这样做:
BEGIN TRANSACTION ALTER TABLE [GiantFactTable] ADD NewDimValueId INT NOT NULL CONSTRAINT [temp_DF_NewDimValueId] DEFAULT (-1) WITH VALUES -- table is not actually rebuilt! ALTER TABLE [GiantFactTable] WITH NOCHECK ADD CONSTRAINT [FK_GiantFactTable_NewDimValue] FOREIGN KEY ([NewDimValueId]) REFERENCES [NewDimValue] ([Id]) -- drop the default constraint,new INSERTs will specify a value for NewDimValueId column ALTER TABLE [GiantFactTable] DROP CONSTRAINT [temp_DF_NewDimValueId] COMMIT TRANSACTION 注意:以上所有内容仅操纵表元数据,无论表大小如何都应该快速. 回填后我们知道数据是一致的,我的问题是SQL引擎怎么能开悟呢?不使表离线. 此命令将使FK受信任,但它需要架构修改(Sch-M)锁定,并且可能需要数小时(几天?)才能使表离线: ALTER TABLE [GiantFactTable] WITH CHECK CHECK CONSTRAINT [FK_GiantFactTable_NewDimValue] 关于工作负载:表有几百个分区(固定数量),数据一次附加到一个分区(以循环方式),从不删除.还有一个恒定的读取工作负载,它使用群集密钥一次从一个分区获取(相对较小的)行范围. 解决方法我想到了一些想法,但它们并不漂亮:重定向工作负载并脱机运行检查约束 >创建具有相同结构的新表. 上面的变化是在步骤3中将相关分区切换到新表.这应该比复制数据更快但我认为在检查约束后你将不得不复制(而不仅仅是切换)数据. 将所有数据插入新表中 >创建一个启用了相同结构和约束的新表 使用索引来加速约束检查? 我不知道这是否有效,但您可以尝试在外键列上创建非聚集索引.还要确保外键引用的表上的相关唯一键有索引. alter table命令可能能够使用它们来加速检查(至少通过最小化IO与执行全??表扫描相比).当然,索引可以在线创建,以避免任何中断. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |