我有两个表[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中并不是那么多专家。所以,请有人帮我理解这两个查询之间的区别吗?
答案 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