我目前有以下查询
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
不是确定性的,也不是我可以订购任何字段来实现它。
答案 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;