联合扇出查询
本文关键字:查询 扇出 | 更新日期: 2023-09-27 18:36:22
我是sql azure的新手。现在我面临着一个大问题,那就是因为SQL Azure联合。在我的一个项目中,我想使用联合。为此,我想从所有联邦中读取数据。如何检查服务器中的联合总数并从联合中读取数据?还有如何将数据插入联合?目前我正在使用:
string strSQL = @"SELECT f.name, fmc.federation_id, fmc.member_id, fmc.range_low, fmc.range_high " +
"FROM sys.federations f " +
"JOIN sys.federation_member_distributions fmc " +
"ON f.federation_id=fmc.federation_id " +
"ORDER BY fmc.federation_id, fmc.range_low, fmc.range_high";
string strTableName = "federation_member_distributions";
try
{
using (SqlConnection connection = new SqlConnection(csb.ToString()))
{
connection.Open();
sbResults.AppendFormat("-- Open {0}'r'n'r'n", csb.ToString());
data = new DataSet();
data.Locale = System.Globalization.CultureInfo.InvariantCulture;
using (SqlCommand command = connection.CreateCommand())
{
// Connect to federation root or federation member
command.CommandText = "USE FEDERATION ROOT WITH RESET";
command.ExecuteNonQuery();
sbResults.AppendFormat("{0}'r'nGO'r'n", command.CommandText);
}
//Retrieve federation root metadata, and populate the data to the DataGridView control
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(strSQL, connection);
sqlDataAdapter.Fill(data, strTableName);
sbResults.AppendFormat("{0}'r'nGO'r'n", strSQL);
}
}
catch (Exception ex)
{
}
但它不起作用
对于上述问题,您确实需要查看这些文章,其中讨论了如何使用SQL Azure Federation:
SQL Azure 中联合的扇出查询简介(第 1 部分):跨多个联合成员的可扩展查询,MapReduce 样式!
在上面,您可以找到扇出示例工具,其中包含显示如何从联合中获取数据的代码。
此示例的第二部分"SQL Azure 中联合的扇出查询(第 2 部分):使用 TOP、ORDER BY、DISTINCT 和其他强大的聚合进行可扩展的扇出查询,MapReduce 样式!"展示了如何通过特定示例运行扇出查询。
尝试上面的示例,如果您遇到任何问题,请告诉我们。
我与SQL Azure Team的Cihan Biyikoglu进行了讨论,以下是他的建议:
这个想法是,您不必使用联合身份验证缓存数据所在位置的"映射",因此您不必这样做;
下面是伪应用代码和执行扇出的实际示例;你也可以在此 UI 中试用代码。
http://federationsutility-seasia.cloudapp.net/About.aspx
Start at the
@i=MIN_VALUE (of the data_type or federation key like customerID=-1)
While (@i not null)
{
Try
{
-- switch to the next member
USE FEDERATION fedname(id=@i)...
-- Run your transaction here for this member
SELECT * FROM table join other_table … WHERE fedkeycolumn >= @i group by … order by …
-- grab the next value
SELECT @i=range_high FROM sys.federation_member_distributions
}
Catch ()
{
If retry_count < total_retries
Exit the loop
}
}
如果您仍然想找出成员,则始终可以在包含联合的数据库中运行查询;
Select * from sys.federation_member_distributions fmd join sys.federations f on fmd.federation_id=f.federation_id
此方法的问题在于,如果在读取信息和完成查询处理之间有间隔,则可能会错过读取数据。
上述不缓存"地图"的方法不容易出现该问题。它将捕获所有成员,而不考虑任何重新分区操作。