我正在使用C#+ SqlServer应用程序处理大量数据负载。
目前,我们的主要问题涉及大规模的单一交易DELETE
操作:DBA建议将该单一的单笔交易拆分为许多交易,以获得以下结果:
(在我们的方案中,放弃单个事务的原子性不是问题:在语义上我们可以执行TRUNCATE
,但不能执行,因为我们正在过滤要删除的行)
我想知道在发出单个(Transact)SQL语句(包含像
这样的循环)之间,在事务管理和同步方面是否有任何区别?SET @r = 1;
WHILE @r > 0
BEGIN
BEGIN TX;
DELETE TOP (100000)
[OUR_BIG_TABLE]
WHERE ...;
SET @r = @@ROWCOUNT;
COMMIT TX;
END
并循环应用程序(C#)代码,在不同的,由客户端处理的事务中发出多个DELETE TOP(100000) ...
。
我的感觉是由于减少了网络往返,单SQL语句具有更好的性能。 相反,我对删除活动与同一表上的其他并发活动之间的同步/锁定有疑问;因此,我的问题具体是:在上述方法之间是否存在差异,即另一客户发出的交易是否可以在我们的流程发出的交易之间交织?
我认为建议的方法之间没有区别(从上述观点来看),因为客户控制的交易等同于BEGIN TX
... COMMIT TX
语句,但是我更喜欢谁比我了解更多...
提前谢谢!