SQL Azure为您提供了设置联合SQL服务器的选项 - 例如实质上是通过某个键在多个服务器上划分数据。但是,当您运行select * from order
时,它会将所有数据重新组合在一起,整个过程对您的应用都是透明的。
现在,假设我有一个存储过程可以自由使用临时表。所以在这种情况下:
-- 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
在这种情况下,数据是否每次都从一台服务器流向主服务器?临时表实际存储在哪里?所有在主框上,还是在联合框之间分开?
答案 0 :(得分:2)
我还没有深入了解SQL Azure Federation,但是我能够为您获取以下信息:
如果您在sql azure中引用联盟,则联邦今天不会将查询扇出到所有成员。您基本上拥有一组数据库,并且事务和查询范围保留在服务器端的单个成员中。
有了这个,临时表就没有神秘感了。每个成员只是另一个带有自己的tempdb的sql azure db。
答案 1 :(得分:2)
Avkash是正确的。联合会分为联合成员,这是一组不共享的数据库。当您运行SELECT * FROM Order之类的语句时,假设Order表已联合,则返回的记录会根据您使用的联合成员而有所不同。
USE FEDERATION命令允许您在不断开连接/重新连接的情况下切换联盟成员。您的代码需要知道联合成员列表并循环遍历每个成员以获取所有记录;一次一个联邦成员。然后在客户端代码上聚合所有记录集以创建应用程序可以使用的单个数据集。您可以制作代码以并行执行所有这些请求。
您可以看到如何使用我在codeplex上发布的库来实现它。它被称为Enzo Shard Library。您需要下载BETA版本,其中包含Federations的代码。该代码允许您使用多个线程获取联合成员的所有记录,以获得最佳性能。