我在让分区功能大规模工作时遇到了问题。CREATE 和 DROP PARTITION 是阻塞操作,您对阻塞几乎没有控制权,如果它无法获得锁,它将以严重级别 16 失败并终止您的连接——如果不重新建立,您将无法捕获并重试连接。但它可能对你有用。此外,需要 MSS 企业版,您不能使用 SE——对于一些规模较小或成本较高的商店来说可能太多了。
我还发现视图 redef 会在 sys 表和对象上以大规模(= 事务量 + 不断插入的数据的绝对量)阻塞 sys 表和对象,因此这些操作可能会在诸如重新索引和 DTCC 之类的事情上死锁——在一种情况下,特别是 SSMS 中的用户(所有事物)试图在对象资源管理器中浏览视图(有人需要告诉那些人有关 READPAST 的信息)。同样,您的里程可能会有所不同。
相比之下, sp_rename 在规模上对我来说效果很好:它使您可以控制锁定及其范围。要在交换之前解决阻塞问题,请尝试如下所示。从表面上看,这似乎在大批量时具有相同的规模问题......但我在实践中没有看到它。所以,为我工作......但同样,每个人的需求和经历都是不同的。
DECLARE @dummylock bit
BEGIN TRANSACTION
BEGIN TRY
-- necessary to obtain exclusive lock on the table prior to swapping
SELECT @dummylock = 1 WHERE EXISTS (SELECT 1 FROM A WITH (TABLOCKX))
-- may or may not be necessary in your case
SELECT @dummylock = 1 WHERE EXISTS (SELECT 1 FROM B WITH (TABLOCKX))
exec sp_rename 'A', 'TEMP'
exec sp_rename 'B', 'A'
exec sp_rename 'TEMP', 'B'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- other error handling here if needed
ROLLBACK TRANSACTION
END CATCH