Elastic Database ツールを使用したマルチシャード クエリ

適用対象:Azure SQL Database

概要

Elastic Database ツールを利用すれば、シャード化されたデータベース ソリューションを作成できます。 マルチシャード クエリ実行は、複数のシャードにまたがるクエリの実行が必要となるデータ収集/レポート作成などのタスクに使用されます (すべての操作を単一のシャード上で実行するデータ依存ルーティングと比べてください)。

  1. TryGetRangeShardMap (Java.NET)、TryGetListShardMap (Java.NET)、または GetShardMap (Java.NET) メソッドを使用して、RangeShardMap (Java.NET) または ListShardMap (Java.NET) を取得します。 「ShardMapManager の作成」と「RangeShardMap または ListShardMap の取得」を参照してください。
  2. MultiShardConnection (Java.NET) オブジェクトを作成します。
  3. MultiShardStatement または MultiShardCommand (Java.NET) を作成します。
  4. CommandText プロパティ (Java.NET) を T-SQL コマンドに設定します。
  5. ExecuteQueryAsync または ExecuteReader (Java.NET) メソッドを呼び出してコマンドを実行します。
  6. MultiShardResultSet または MultiShardDataReader (Java.NET) クラスを使用して結果を表示します。

次のコードは、 myShardMap という名前の ShardMapを使用してマルチシャード クエリを実行する方法を示しています。

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 が 1 つのデータベースに作用する一方、MultiShardConnection は入力として "シャードのコレクション" を受け取ります。 シャードのコレクションは、シャード マップから設定します。 次に、 UNION ALL セマンティクスを使用してシャードのコレクションに対するクエリを実行して、単一の全体的な結果を生成します。 必要に応じて、コマンドの ExecutionOptions プロパティを使用して、行の元になっているシャードの名前を出力に追加できます。

ここで、 myShardMap.GetShards() の呼び出しに注目してください。 このメソッドは、シャード マップからすべてのシャードを取得し、すべての関連データベースを対象にクエリを実行する簡単な方法を提供します。 マルチシャード クエリのためのシャードのコレクションは、 myShardMap.GetShards() 呼び出しから返されたコレクションに対して LINQ クエリを実行することによって、さらに絞り込むことができます。 部分的な結果のポリシーとの組み合わせにおいて、マルチシャード クエリ実行の現在の機能は、数十から最大で数百のシャードで適切に動作するように設計されています。

現在のマルチシャード クエリ実行には、クエリの対象となるシャードとシャードレットの検証が欠けているという制限があります。 データ依存ルーティングでは特定のシャードがシャード マップの一部であることが照会時に確認されますが、マルチシャード クエリ実行ではこのようなチェックは実行されません。 そのため、シャード マップから削除されたデータベースに対してマルチシャード クエリが実行される可能性があります。

マルチシャード クエリと分割/マージ操作

マルチシャード クエリでは、照会されたデータベース上のシャードレットが進行中の分割/マージ操作に参加しているかどうかは確認されません。 (「Elastic Database 分割/マージ ツールを使用したスケーリング」をご覧ください)。そのため、同じマルチシャード クエリ内で複数のデータベースに対して同じシャードレットの行が表示される不整合が発生する可能性があります。 これらの制限を考慮したうえで、マルチシャード クエリを実行するときは、進行中の分割/マージ操作とシャード マップへの変更をドレインすることを検討してください。

その他のリソース

まだ弾力性データベース ツールを使用していない場合は、 ファースト ステップ ガイドを参照してください。 ご質問がある場合は、SQL Database に関する Microsoft Q&A 質問ページを参照してください。機能に関するご要望は、SQL Database に関するフィードバック フォーラムで新しいアイデアを追加したり、既存のアイデアに投票したりしてください。