使用弹性数据库工具进行多分片查询
适用于:Azure SQL 数据库
概述
可以使用弹性数据库工具创建分片数据库解决方案。 多分片查询用于诸如数据收集/报告等需要跨多个分片运行查询的任务。 (相比之下,数据依赖型路由会在单个分片上执行所有操作。)
- 使用 TryGetRangeShardMap(Java、.NET)、TryGetListShardMap(Java、.NET)或 GetShardMap(Java、.NET)方法获取 RangeShardMap(Java、.NET)或 ListShardMap(Java、.NET)。 请参阅构造 ShardMapManager 和获取 RangeShardMap 或 ListShardMap。
- 创建 MultiShardConnection(Java、.NET)对象。
- 创建 MultiShardStatement 或 MultiShardCommand(Java、.NET)。
- 设置 T-SQL 命令的 CommandText 属性(Java、.NET)。
- 通过调用 ExecuteQueryAsync 或 ExecuteReader(Java、.NET)方法执行该命令。
- 使用 MultiShardResultSet 或 MultiShardDataReader(Java、.NET)类查看结果。
示例
以下代码使用给定的 ShardMap (名为 myShardMap)演示多分片查询的用法。
using (MultiShardConnection conn = new MultiShardConnection(myShardMap.GetShards(), myShardConnectionString))
{
using (MultiShardCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT c1, c2, c3 FROM ShardedTable";
cmd.CommandType = CommandType.Text;
cmd.ExecutionOptions = MultiShardExecutionOptions.IncludeShardNameColumn;
cmd.ExecutionPolicy = MultiShardExecutionPolicy.PartialResults;
using (MultiShardDataReader sdr = cmd.ExecuteReader())
{
while (sdr.Read())
{
var c1Field = sdr.GetString(0);
var c2Field = sdr.GetFieldValue<int>(1);
var c3Field = sdr.GetFieldValue<Int64>(2);
}
}
}
}
主要区别在于多分片连接的构建。 其中,“SqlConnection”对个别数据库执行操作,而“MultiShardConnection”则将“分片集合”用作其输入。 填充分片映射中的分片集合。 然后,使用 UNION ALL 语义组成一个总体结果,在分片集合上执行查询。 或者,也可以在命令上使用 ExecutionOptions 属性,将行所源自的分片的名称添加到输出。
请注意对 myShardMap.GetShards() 的调用。 此方法可从分片映射中检索所有分片,并提供一种轻松方式在所有相关数据库上运行查询。 对通过调用 myShardMap.GetShards() 返回的集合执行 LINQ 查询,进一步优化用于多分片查询的分片集合。 多分片查询中的当前功能已随部分结果策略一起被设计为供数十至数百种分片使用。
多分片查询目前存在的一个限制是,缺少对需要查询的分片和 shardlet 进行验证。 尽管依赖于数据的路由会在查询时验证给定的分片是否为分片映射的一部分,但多分片查询不会执行此检查。 这可能会导致多分片查询在已从分片映射中删除的数据库上运行。
多分片查询和拆分/合并操作
多分片查询不会验证查询的数据库上的 shardlet 是否参与正在进行的拆分/合并操作。 (请参阅使用弹性数据库拆分/合并工具进行缩放。)) 这可能会导致不一致问题,即为同一多分片查询中的多个数据库显示同一 shardlet 中的行。 请注意这些限制并在执行多分片查询时,考虑关闭正在进行的拆分/合并操作以及对分片映射的更改。
相关内容
尚未使用弹性数据库工具? 请查看入门指南。