次の方法で共有


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

適用対象:Azure SQL データベース

概要

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

  1. RangeShardMap (Java.NET) または ListShardMap (Java.NET) を、TryGetRangeShardMap (Java.NET)、TryGetListShardMap (Java.NET)、または GetShardMap (Java.NET) メソッドを使用して取得します。 「ShardMapManager の作成」と「RangeShardMap または ListShardMap の取得」を参照してください。
  2. MultiShardConnection (Java.NET) オブジェクトを作成します。
  3. MultiShardStatementまたはMultiShardCommand (Java.NET) を作成します。
  4. CommandText property (Java.NET) を T-SQL コマンドに設定します。
  5. ExecuteQueryAsyncまたは ExecuteReader (Java.NET) メソッドを呼び出して、コマンドを実行します。
  6. MultiShardResultSetまたはMultiShardDataReader (Java.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 セマンティクスを使用してシャードのコレクションに対してクエリが実行され、1 つの全体的な結果がアセンブルされます。 必要に応じて、コマンドの ExecutionOptions プロパティを使用して、行の起点となるシャードの名前を出力に追加できます。

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

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

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

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

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