从表中删除大量数据时速度很慢

时间:2018-03-20 07:31:23

标签: sql sql-server

我有两个表[AssetPhoto]和[AssetPhoto_Backup],必须根据[AssetPhoto_Backup]表从[AssetPhoto]中删除一些记录,比如700万。

表结构非常简单

CREATE TABLE [dbo].[AssetPhoto](
    [PhotoID] [int] NOT NULL,
    [AssetNumber] [nvarchar](50) NULL,
    [PhotoCaption] [nvarchar](50) NULL,
    [PhotoContent] [image] NULL,
    [PhotoCaptured] [datetime] NULL,
    [LastEditDate] [datetime] NULL,
    [CreationDate] [datetime] NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

[AssetPhoto_Backup]表的结构

    CREATE TABLE [dbo].[AssetPhoto_Backup](
    [PhotoID] [int] NOT NULL,
    [AssetNumber] [nvarchar](50) NULL,
    [PhotoCaption] [nvarchar](50) NULL,
    [PhotoContent] [image] NULL,
    [PhotoCaptured] [datetime] NULL,
    [LastEditDate] [datetime] NULL,
    [CreationDate] [datetime] NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

删除查询是

declare @i int =0; 



while(@i<=700) 

begin 

delete top(10000) a  from AssetPhoto a  join AssetPhoto_Backup ab 
on ab.photoid=a.photoid  

set @i=@i+1; 

end 

两者都有聚集索引。当我尝试使用MSSQl的调优顾问来提高性能时,它没有给出任何建议。两个表都将PhotoId作为PK。

如何提高查询性能?为什么在流程进行过程中流程速度会变慢。请提前感谢答案。

我还有一个查询,

    declare @i int =0; 



        while(@i<=700) 

        begin 

       delete  a from AssetPhoto a 
where a.photoid  in(select Top 10000 Suba.photoid
         from AssetPhoto Suba join AssetPhoto_Backup subab
         on subab.photoid=suba.photoid)

        set @i=@i+1; 

        end 

哪一个提供了更好的性能?我在SQL server中并不是那么多专家。所以,请有人帮我理解这两个查询之间的区别吗?

1 个答案:

答案 0 :(得分:1)

在每批次之后提交您的删除,因此事务日志不需要增长。

此外,我减少了批量大小并增加了循环次数,因此批次会更小并且更频繁地提交,从而减少了事务日志的负担。

declare @i int =0; 

while(@i<=7000)    
begin 

  begin transaction;

  delete top(1000) a  
  from AssetPhoto a  
       join AssetPhoto_Backup ab on ab.photoid=a.photoid;

  commit transaction;

  set @i=@i+1;     
end