你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用弹性数据库工具进行多分片查询

适用于:Azure SQL 数据库

概述

通过使用Azure SQL 数据库进行横向扩展,您可以创建分片数据库解决方案。 多分片查询用于诸如数据收集/报告等需要跨多个分片运行查询的任务。 (相比之下,数据依赖型路由会在单个分片上执行所有操作。)

  1. 获取RangeShardMapJava, .NET)或ListShardMapJava, .NET),可使用TryGetRangeShardMapJava, .NET)、TryGetListShardMapJava, .NET)或GetShardMapJava, .NET)方法。 请参阅构造 ShardMapManager获取 RangeShardMap 或 ListShardMap
  2. 创建一个 MultiShardConnectionJava.NET) 对象。
  3. 创建一个MultiShardStatementMultiShardCommandJava.NET)。
  4. CommandText propertyJava.NET) 设置为 T-SQL 命令。
  5. 通过调用 ExecuteQueryAsyncExecuteReaderJava.NET) 方法执行命令。
  6. 使用 MultiShardResultSetMultiShardDataReaderJava.NET) 类查看结果。

示例

下面的代码演示了使用名为 的给定 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 中的行。 请注意这些限制并在执行多分片查询时,考虑关闭正在进行的拆分/合并操作以及对分片映射的更改。

尚未使用弹性数据库工具? 请查看入门指南。 如有问题,请在有关 SQL 数据库的 Microsoft Q&A 问题页面上联系我们;如有功能请求,请在 SQL 数据库反馈论坛添加新意见或为现有意见投票。