2014-01-22 117 views
0

我有一個存儲過程都到三個不同的服務器,並得到價值從所有的人都像這樣:不同服務器上更新一個臨時表從多個表中的列

Update #temp 
set col1.temp = t1col1.table 
from #temp inner join table1.Server1 on temp.id = table1.id 
Update #temp 
set col2.temp = t2col2.table 
from #temp inner join table2.Server1 on temp.id = table2.id 
Update #temp 
set col3.temp = t3col3.table 
from #temp inner join table3.Server1 on temp.id = table3.id 

注:以上前更新聲明我已經用本地服務器上的所有值更新了我的臨時文件

這就是我更新表的方式。爲了更好地優化並獲得更快的結果,我這樣做:

update #temp 
set col1.temp = t1col1.table, 
col2.temp = t2col2.table, 
col3.temp = t3col3.table 
from #temp inner join table1.server1 on temp.id= table1.id 
leftjoin table2.server1 on temp.id = table2.id 
leftjoin table3.server1 on temp.id = table3.id 

的基本想法我是爲了減少花費多次更新一個更新的時間。該存儲過程從3臺不同的服務器中生成大約300,000行和大約30列。

我有幾個基本問​​題:

  1. 是更好地使用多個UPDATE語句或通過多個單UPDATE語句連接

  2. 如果我可以用一個UPDATE語句比它更好地使用INNER JOIN或LEFT JOIN編寫更新

  3. 處理大量數據時JOIN是否耗時? (注意:我從我的列中獲得的所有服務器和表都有數百萬條記錄)哪個JOIN更好?

  4. 我嘗試過使用INNER JOINs,但它不適用於表2和表3;它只是工作的表1

上述UPDATE語句是服務器1,它們是相同的服務器2和服務器3,因爲他們有一定的價值,我需要。

+0

什麼約定您使用拉從其他服務器上的數據,鏈接服務器(http://technet.microsoft.com/en -us /庫/ ms188279.aspx)? – AWinkle

+0

我不明白你在說什麼約定,但這是我如何從[服務器] .tablename選擇值選擇 –

+0

@JordanBelfort你的意思是[database] .tablename?我可能在這裏絕對錯誤,但聽起來更像是你在同一臺服務器上有多個數據庫。那麼不用連接服務器或其他約定就可以從多個地方提取數據。所以服務器1將DB1,服務器2將DB2等... – Jfabs

回答

0

根據您的預測數據集,我的鏈接服務器個人歷史記錄(4臺物理服務器上有7個SQL實例,某些表以50-100M行/服務器封頂)以及一些優秀的TechNet文章,我建議創建一個類似的視圖到

select t1col1.table, t2col2.table, t3col3.table 
from table1 on temp.id= table1.id 
leftjoin table2 on table1.id = table2.id 
leftjoin table3 on table1.id = table3.id 

然後在您的鏈接服務器上執行單一連接到視圖。每個連接本質上都會創建一個新的OLE連接,並且SQL引擎可以決定在本地抽取整個數據集以執行連接。在儘可能多地保存數據的服務器上儘可能多地使用數據,這將與性能有所不同。

良好的閱讀:

linked-server-behavior-when-used-on-join-clauses

Linked Servers (Database Engine)

+0

這將如何更新我的#temp表,並且所有的Select語句只用於一臺服務器更新.. –

+0

甚至我的舊方法是一樣的,我不能再次使用它; –

相關問題