2017-06-01 46 views
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 

回答

2

最簡單的,儘管我能想到kludgey方法是創建每個索引重建SQL Server代理作業,然後一後另一個火了每個作業。

嘿,我說這是kludgey! :)

涉及大量代碼的更好方法是使用Sql Server Service Broker。你可以將一個基本框架很快結合起來,但如果你想讓它具有彈性,那麼你會想花一些時間在它上面。

另一種可能是介於二者之間,但涉及以.Net語言(例如C#)編寫代碼的方法是編寫一個引發異步調用的過程,儘管您可能需要留意爲此利用資源。

你最好的「外部,但內部」的選擇將是把指數在SSIS包重建,並呼籲從你的腳本,無論是作爲一個SQL代理作業或直接調用,

TL; DR:Sql Server本身不提供任何通過T-SQL運行異步查詢的本地方法。

+0

謝謝,瑞秋。把每個重建工作作爲一項工作是最後的手段,因爲我們需要超過200個,但是一個TSQL腳本可以立即創建200個作業,在終止時刪除自己。這是一種避開異步查詢的方法嗎? – cloudsafe

+0

是的,它需要更多的權限,購買是的,這是一種可能性。這完全取決於您準備創建多少代碼!另外,您可能無法刪除正在運行的作業,因此您可能需要調用一個將檢查已完成的「臨時」作業的家務「固定」作業並將其刪除。 –