我在我们的生产数据库上运行一个脚本,引用两个表:我们的用户表(其中 3700 个)和他们所做的报价表(其中 280000 个)。Quote 是我们应用程序中的主要对象,一个非常大的对象,为其创建和填充了许多数据表。我的目标是从所有报价中清除数据库,但由一小部分用户组成的报价除外。
我首先创建一个临时表,其中包含这些用户的 id(它也在脚本中使用),然后创建一个游标,该游标在主表中运行,用于列出引号以及从用户组创建的那些引号必要的清洁。
我看到这个脚本将执行大约 26 小时,我认为这很奇怪,因为我需要大约 15 分钟来恢复数据库,我猜最重的 sql 在那里执行。但是,数据库的重量超过 100GB。
是否有脚本的某些部分是我非常不理想的,或者您有一些建议如何通过更短的执行来完成。
我们正在运行 SQL Server 2008 R2。
这是脚本的草图。
CREATE table #UsersIdsToStay(user_id int)
INSERT INTO #UsersIdsToStay
select user_id
from users
where user_name like '%SOMESTRING '
-----
declare @QuoteId int
declare @UserId int
declare QuoteCursor cursor for
select DISTINCT QuoteId, UserId
from QuotesTable
where UserId not in
(
select * from #UsersIdsToStay
)
open QuoteCursor
while 1=1
begin
fetch QuoteCursor into @QuoteId, @UserId
if @@fetch_status != 0 break
-- all the deletions from related tables are executed here using @QuoteId and @UserId
exec('delete from QuoteHistory where QuoteId = ' + @QuoteId + ' and UserId = ' + @UserId )
exec('delete from QuoteRevisions where QuoteId = ' + @QuoteId + ' and UserId = ' + @UserId )
exec('delete from QuoteItems where QuoteId = ' + @QuoteId + ' and UserId = ' + @UserId )
....
end
close QuoteCursor;
deallocate QuoteCursor