2017-03-16 122 views
0

我正在对一组ID进行批量删除,将其作为发送到存储过程的字符串,并以逗号分隔。我有一个函数将它们分解成一个表格,以便我们可以对它们进行比较。即使我有SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;,我有时也会在此SP上发生死锁。有没有更好的方式来执行批量删除,然后用SP来提高性能并且不会造成死锁?批量删除时发生死锁,需要更好的性能

DELETE FROM Game 
      WHERE Id IN (
       SELECT g.Id 
       FROM Game g 
       INNER JOIN [EventGame] eg ON g.Id = eg.Id 
       INNER JOIN MemberEvent me ON me.EventId = eg.EventId 
       WHERE 
        eg.EventId = @EventId AND 
        g.Id IN (SELECT * FROM dbo.Split(@DeletedGameIds, ',')) AND 
        (g.[Type] = 1 OR g.[Type] IS NULL) AND 
        me.MemberId = @MemberId 
) 
+0

此删除是否在OLTP应用程序在应用程序在线时发生删除? –

+0

什么是游戏桌上的Id列索引? –

+0

Clustered Index,Primary Key –

回答

0

更好的删除方法是通过识别要删除的id列表,然后通过id删除一个聚簇索引。

CREATE Table #temp (Id Int) 

Insert into #temp (Id) 
SELECT Id FROM Game 
      WHERE Id IN (
       SELECT g.Id 
       FROM Game g 
       INNER JOIN [EventGame] eg ON g.Id = eg.Id 
       INNER JOIN MemberEvent me ON me.EventId = eg.EventId 
       WHERE 
        eg.EventId = @EventId AND 
        g.Id IN (SELECT * FROM dbo.Split(@DeletedGameIds, ',')) AND 
        (g.[Type] = 1 OR g.[Type] IS NULL) AND 
        me.MemberId = @MemberId 
) 

--you can do this delete in looping with batch size of 50000 records and use checkpoint 
DELETE G 
FROM Game G 
Inner Join #temp t 
ON G.ID = t.Id 
--checkpoint 
+0

我试试看。我应该先将IDS分成临时表,还是在Select中使用它们都没有任何效果。 –