1. 程式人生 > >【優化SQL Server迴圈更新、插入耗時長的問題】

【優化SQL Server迴圈更新、插入耗時長的問題】

一: 工作當中遇到更新較多資料時,使用迴圈(while,或遊標)進行增刪改時,特別費時 

WHILE @i <= @rows
BEGIN
  SELECT @appNo = AppNumber, @roleid = RoleId, @statusi= Status, @empId = EmployeeId FROM #Atable WHERE ID = @i
  IF EXISTS(SELECT 1 FROM Btable WHERE AppNumber = @appNo AND RoleID = @roleid AND EmployeeId = @empId)
       BEGIN


        UPDATE Btable
    SET Status = @statusi, CreatedBy = NULL, ModifiedOn = GETDATE()
    WHERE AppNumber = @appNoi AND RoleId = @roleidi AND EmployeeId = @empId
  END
  ELSE
  BEGIN
    INSERT INTO Btable(EmployeeId, AppNumber, RoleId, Status, CreatedOn, CreatedBy, ModifiedOn, ModifiedBy)

    SELECT EmployeeId, AppNumber, RoleId, Status, GETDATE(), CreatedBy, GETDATE(), ModifiedBy FROM #Atable WHERE ID = @i
  END

  SELECT @i= @i + 1
END

二:利用表左、右連線進行批量刪除解決迴圈增刪改耗時長的問題

  update aru set aru.Status = arul.Status, aru.ModifiedOn = GETDATE()
  from Btable as aru
  inner join Atable as arul
  on aru.AppNumber = arul.AppNumber and aru.RoleId = arul.RoleId and aru.EmployeeID = arul.EmployeeID

三:A,B兩張表中有可能資料不相等,可以宣告兩個變數@count1,@count2

  DECLARE @Count1 int,@Count2 int
  select @Count1 = COUNT(1) from Atable
  select @Count2 = COUNT(1) from Btable

四: 根據@count1和@count2的大小判斷是否新增還是刪除

IF(@Count1 > @Count2)
BEGIN  
  SELECT * INTO Btable
  from Atable as arul
  left join Btable as aru
  on aru.AppNumber = arul.AppNumber and aru.RoleId = arul.RoleId and aru.EmployeeID = arul.EmployeeID
  where aru.AppNumber is null and aru.RoleId is null and aru.EmployeeID is null
END
ELSE
BEGIN
  update aru set aru.Status = 0
  from Btable as aru
  left join Atable as arul
  on aru.AppNumber = arul.AppNumber and aru.RoleId = arul.RoleId and aru.EmployeeID = arul.EmployeeID
  where arul.AppNumber is null and arul.RoleId is null and arul.EmployeeID is null
END

 

個人工作中總結出來,如有轉載請註明出處!