Elastic Database ツールを使用したマルチシャード クエリ
適用対象: Azure SQL データベース
概要
Elastic Database ツールを利用すれば、シャード化されたデータベース ソリューションを作成できます。 マルチシャード クエリ実行は、複数のシャードにまたがるクエリの実行が必要となるデータ収集/レポート作成などのタスクに使用されます (すべての操作を単一のシャード上で実行するデータ依存ルーティングと比べてください)。
- 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) を作成します。
- CommandText プロパティ (Java、.NET) を T-SQL コマンドに設定します。
- ExecuteQueryAsync または ExecuteReader (Java、.NET) メソッドを呼び出してコマンドを実行します。
- 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 に関するフィードバック フォーラムで新しいアイデアを追加したり、既存のアイデアに投票したりしてください。