2012-05-11 27 views
0

SQL Azure爲您提供了設置聯合SQL服務器的選項 - 例如實質上是通過一些密鑰將數據分配到多個服務器。但是,當您運行select * from order時,它會將所有數據重新放在一起,整個過程對您的應用程序都是透明的。對聯邦SQL Server運行查詢時數據會發生什麼變化?

現在,假設我有一個存儲過程,可以自由使用臨時表。所以在這樣的情況下:

-- query uses data from each partitioned server 
select tbl1.Column1, tbl2.Column2 
into #tmpTable 
from tbl1 
join tbl2.id = tbl1.id 
where tbl2.Column3 = '234' 

-- also uses data from each partitioned server 
select #tmpTable.* 
from tbl3 
join tbl3.fkey = #tmpTable.Column1 

在這種情況下,數據是否每次都從一臺服務器流向主服務器?臨時表在哪裏實際存儲?所有在主箱子上,還是在聯合的之間分開?

回答

2

Avkash是正確的。聯合會被分成聯合成員,這是一羣不分享數據的數據庫。當您運行像SELECT * FROM Order這樣的語句時,假設訂單表已聯合,則返回的記錄因您使用的聯合成員而異。

USE FEDERATION命令允許您在不斷開/重新連接的情況下切換聯合成員。您的代碼需要知道聯邦成員列表,並循環訪問每個成員以獲取所有記錄;一次一個聯合會成員。然後在客戶端代碼上,彙總所有記錄集以創建應用程序可以使用的單個數據集。您可以製作代碼以並行執行所有這些請求。

你可以看到如何使用我在codeplex上發佈的庫來實現這個功能。它被稱爲Enzo Shard Library。您需要下載包含聯盟代碼的BETA版本。該代碼將允許您使用多個線程獲取跨聯合成員的所有記錄以獲得最佳性能。

+0

那麼SQL Azure中不存在自動分片的整個概念? – AngryHacker

+0

不確定你的意思是自動分片。如果你的意思是自動縮放,答案是否定的;當您需要更多容量/處理資源時,您需要監控您的成員以將其拆分。如果你指的是粉絲支持,答案是否定的...... :)目前還不支持扇出操作。但Azure是一個快速發展的環境。這些事情可能會在某個時候出現。 –

2

我在SQL Azure中總會感到不徹底還沒有,不過我能得到您的以下信息:

如果你指的是在SQL Azure的聯盟,聯盟今天沒有扇出查詢到所有成員。您基本上擁有一組數據庫和事務範圍,並且查詢保留在服務器端的單個成員中。

因此,臨時表沒有神祕感。每個成員只是另一個自帶tempdb的sql azure數據庫。

相關問題