0
我有一個動態查詢來重建所有連接到我們的中央SQL Server幷包含在列表中的鏈接服務器上的索引和統計信息。它運行良好,但是如果在單獨的spid上運行,它們可以更快地完成,因爲它是執行這項工作的遠程服務器,所以它們可以串行運行。 有沒有辦法改變腳本以允許它們並行運行,而不是等待每個完成呢?如何跨多個線程運行動態查詢
WITH TillNames as (select * from (values
('[DEVELOPERSVR]', '100', 'AD01'),
('[TESTSVR1]', '100', 'AD02'),
('[TESTSVR2]', '100', 'AD03'),
('[TESTSVR3]', '100', 'AD04') -- and two hundred more.
) a ([TillName], [Branch], [TillDesc])) -- Branch and Till Desc used for other purposes, removed here
select * INTO #tills from TillNames
declare @TillName as nvarchar(20), @Branch as nvarchar(5), @TillDesc as nvarchar(100)
declare @sql as nvarchar(max)
declare mycursor cursor for Select [TillName], [Branch], [TillDesc] from #tills
declare @query as nvarchar(max)
open mycursor
fetch next from mycursor into @TillName, @Branch, @TillDesc
while @@FETCH_STATUS=0
BEGIN
set @sql = 'USE [LOCALDB]
Declare @TBname nvarchar(255), @SQL nvarchar(max)
select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE=''''BASE TABLE''''
while @TBname is not null
BEGIN
begin try
set @SQL=''''ALTER INDEX ALL ON ['''' + @TBname + ''''] REBUILD; ''''
SET @SQL = @SQL + N''''UPDATE STATISTICS ['''' + @TBname + ''''] WITH FULLSCAN; ''''
EXEC SP_EXECUTESQL @SQL
end try
begin catch
print ''''DID NOT WORK: '''' + @SQL
end catch
select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE=''''BASE TABLE'''' and TABLE_NAME > @TBname
END'
set @query = N'EXEC (''' + @sql + N''') AT ' + @TillName
exec (@query)
fetch next from mycursor into @TillName, @Branch, @TillDesc
END
close mycursor
deallocate mycursor
drop table #tills
謝謝,瑞秋。把每個重建工作作爲一項工作是最後的手段,因爲我們需要超過200個,但是一個TSQL腳本可以立即創建200個作業,在終止時刪除自己。這是一種避開異步查詢的方法嗎? – cloudsafe
是的,它需要更多的權限,購買是的,這是一種可能性。這完全取決於您準備創建多少代碼!另外,您可能無法刪除正在運行的作業,因此您可能需要調用一個將檢查已完成的「臨時」作業的家務「固定」作業並將其刪除。 –