输出结果并更新第二个表而不使用临时表

时间:2014-03-17 21:12:42

标签: sql sql-server sql-server-2005

我目前有以下查询

SELECT TOP (@batchSize) * into #t 
from iv.SomeView
where EXISTS(select * 
             from iv.PendingChanges 
             where SomeView.RecordGuid = PendingChanges .RecordGuid)

update iv.PendingChanges
set IsQueued = 1
where RecordGuid in (select #t.RecordGuid from #t)

select * from #t

这种模式(在各种查询中使用不同的视图和PendingChanges表)经常运行,我试图弄清楚如何减少对tempdb的写入,因为写入{{ 1}}。

我提出了这个解决方案,在将它与分析器中的旧版本进行比较时确实提升了性能

#t

但是有没有办法更好地做到这一点所以我可以得到输出结果并更新select top (0) * into #t from iv.SomeView insert into #t with (TABLOCK) output inserted.* SELECT TOP (@batchSize) * from iv.SomeView where EXISTS(select * from iv.PendingChanges where SomeView.RecordGuid = PendingChanges.RecordGuid) update iv.PendingChanges set IsQueued = 1 where RecordGuid in (select #t.RecordGuid from #t) 而无需暂时将结果写入PendingChanges.IsQueued

重要提示:我只能从#t获得一个select,因为该表非常活跃并且执行多个iv.SomeView不是确定性的,也不是我可以订购任何字段来实现它。

1 个答案:

答案 0 :(得分:0)

您是否尝试过以下代码:

update top (@batchsize) PC 
Set IsQueued = 1
    output inserted.*
From iv.PendingChanges PC 
inner join iv.SomeView SV
on iv.SomeView.RecordGuid = iv.PendingChanges.RecordGuid;