Elastic Database ツールを使用したマルチシャード クエリMulti-shard querying using elastic database tools

概要Overview

Elastic Database ツールを利用すれば、シャード化されたデータベース ソリューションを作成できます。With the Elastic Database tools, you can create sharded database solutions. マルチシャード クエリ実行は、複数のシャードにまたがるクエリの実行が必要となるデータ収集/レポート作成などのタスクに使用されます Multi-shard querying is used for tasks such as data collection/reporting that require running a query that stretches across several shards. (すべての操作を単一のシャード上で実行するデータ依存ルーティングと比べてください)。(Contrast this to data-dependent routing, which performs all work on a single shard.)

  1. TryGetRangeShardMap (Java.NET)、TryGetListShardMap (Java.NET)、または GetShardMap (Java.NET) メソッドを使用して、RangeShardMap (Java.NET) または ListShardMap (Java.NET) を取得します。Get a RangeShardMap (Java, .NET) or ListShardMap (Java, .NET) using the TryGetRangeShardMap (Java, .NET), the TryGetListShardMap (Java, .NET), or the GetShardMap (Java, .NET) method. ShardMapManager の作成」と「RangeShardMap または ListShardMap の取得」を参照してください。See Constructing a ShardMapManager and Get a RangeShardMap or ListShardMap.
  2. MultiShardConnection (Java.NET) オブジェクトを作成します。Create a MultiShardConnection (Java, .NET) object.
  3. MultiShardStatement または MultiShardCommand (Java.NET) を作成します。Create a MultiShardStatement or MultiShardCommand (Java, .NET).
  4. CommandText プロパティ (Java.NET) を T-SQL コマンドに設定します。Set the CommandText property (Java, .NET) to a T-SQL command.
  5. ExecuteQueryAsync または ExecuteReader (Java.NET) メソッドを呼び出してコマンドを実行します。Execute the command by calling the ExecuteQueryAsync or ExecuteReader (Java, .NET) method.
  6. MultiShardResultSet または MultiShardDataReader (Java.NET) クラスを使用して結果を表示します。View the results using the MultiShardResultSet or MultiShardDataReader (Java, .NET) class.

Example

次のコードは、 myShardMap という名前の ShardMapを使用してマルチシャード クエリを実行する方法を示しています。The following code illustrates the usage of multi-shard querying using a given ShardMap named 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);
            }
        }
    }
}

主な相違点は、マルチシャード接続の構築です。A key difference is the construction of multi-shard connections. SqlConnection が 1 つのデータベースに作用する一方、MultiShardConnection は入力としてシャードのコレクションを受け取ります。Where SqlConnection operates on an individual database, the MultiShardConnection takes a collection of shards as its input. シャードのコレクションは、シャード マップから設定します。Populate the collection of shards from a shard map. 次に、 UNION ALL セマンティクスを使用してシャードのコレクションに対するクエリを実行して、単一の全体的な結果を生成します。The query is then executed on the collection of shards using UNION ALL semantics to assemble a single overall result. 必要に応じて、コマンドの ExecutionOptions プロパティを使用して、行の元になっているシャードの名前を出力に追加できます。Optionally, the name of the shard where the row originates from can be added to the output using the ExecutionOptions property on command.

ここで、 myShardMap.GetShards() の呼び出しに注目してください。Note the call to myShardMap.GetShards(). このメソッドは、シャード マップからすべてのシャードを取得し、すべての関連データベースを対象にクエリを実行する簡単な方法を提供します。This method retrieves all shards from the shard map and provides an easy way to run a query across all relevant databases. マルチシャード クエリのためのシャードのコレクションは、 myShardMap.GetShards() 呼び出しから返されたコレクションに対して LINQ クエリを実行することによって、さらに絞り込むことができます。The collection of shards for a multi-shard query can be refined further by performing a LINQ query over the collection returned from the call to myShardMap.GetShards(). 部分的な結果のポリシーとの組み合わせにおいて、マルチシャード クエリ実行の現在の機能は、数十から最大で数百のシャードで適切に動作するように設計されています。In combination with the partial results policy, the current capability in multi-shard querying has been designed to work well for tens up to hundreds of shards.

現在のマルチシャード クエリ実行には、クエリの対象となるシャードとシャードレットの検証が欠けているという制限があります。A limitation with multi-shard querying is currently the lack of validation for shards and shardlets that are queried. データ依存ルーティングでは特定のシャードがシャード マップの一部であることが照会時に確認されますが、マルチシャード クエリ実行ではこのようなチェックは実行されません。While data-dependent routing verifies that a given shard is part of the shard map at the time of querying, multi-shard queries do not perform this check. そのため、シャード マップから削除されたデータベースに対してマルチシャード クエリが実行される可能性があります。This can lead to multi-shard queries running on databases that have been removed from the shard map.

マルチシャード クエリと分割/マージ操作Multi-shard queries and split-merge operations

マルチシャード クエリでは、照会されたデータベース上のシャードレットが進行中の分割/マージ操作に参加しているかどうかは確認されません。Multi-shard queries do not verify whether shardlets on the queried database are participating in ongoing split-merge operations. (「Elastic Database 分割/マージ ツールを使用したスケーリング」をご覧ください)。そのため、同じマルチシャード クエリ内で複数のデータベースに対して同じシャードレットの行が表示される不整合が発生する可能性があります。(See Scaling using the Elastic Database split-merge tool.) This can lead to inconsistencies where rows from the same shardlet show for multiple databases in the same multi-shard query. これらの制限を考慮したうえで、マルチシャード クエリを実行するときは、進行中の分割/マージ操作とシャード マップへの変更をドレインすることを検討してください。Be aware of these limitations and consider draining ongoing split-merge operations and changes to the shard map while performing multi-shard queries.

その他のリソースAdditional resources

まだ弾力性データベース ツールを使用していない場合は、Not using elastic database tools yet? ファースト ステップ ガイドを参照してください。Check out our Getting Started Guide. 質問がある場合は、SQL Database のフォーラムに投稿してください。機能に関するご要望は、SQL Database に関するフィードバック フォーラムにお寄せください。For questions, please reach out to us on the SQL Database forum and for feature requests, please add them to the SQL Database feedback forum.