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