適用於:Azure SQL 資料庫
概觀
透過 使用 Azure SQL Database 向外延展,您可以建立分區化資料庫解決方案。 多分區查詢 可用於需要執行跨數個分區之查詢的工作,例如數據收集/報告。 (這與 數據相依路由 形成對比,這會在單一分區上執行所有工作。)
- 使用
RangeShardMap、 或 方法相關技術(ListShardMap、.NET)來取得 (TryGetRangeShardMap、.NET)或 (TryGetListShardMap、.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) 類別檢視結果。
範例
下列程式碼說明如何使用多分區查詢,並且指定的 ShardMap 名稱為 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 語意在分區集合上執行,以組合單一整體結果。 選擇性地,您可以使用命令中的ExecutionOptions屬性,將該列所屬分片的名稱新增至輸出。
注意對 myShardMap.GetShards() 的呼叫。 這個方法會從分區對應擷取所有分區,並提供簡單的方法,跨所有相關資料庫執行查詢。 透過呼叫 myShardMap.GetShards()所傳回的集合,可以透過執行 LINQ 查詢來進一步改良多分區查詢的集合。 結合部分結果原則,多分區查詢中的目前功能已設計為適用於數十到數百個分區。
多重分區查詢的限制目前缺少查詢之分區和 Shardlet 的驗證。 雖然數據相依路由會確認指定的分區在查詢時屬於分區對應,但多分區查詢不會執行這項檢查。 這可能會導致在已從分區對應中移除的資料庫上執行的多分區查詢。
多分區查詢和分割合併作業
多分區查詢不會驗證查詢資料庫上的shardlet是否參與進行中的分割合併作業。 (請參閱 在向外延展雲端資料庫之間移動數據。這可能會導致同一 shardlet 中的數據列在相同的多分片查詢中針對多個資料庫顯示時出現不一致情況。 請注意這些限制,並考慮在執行多分區查詢時清空進行中的分割合併作業和分區對應變更。
相關內容
尚未使用彈性資料庫工具? 請參閱使用者入門指南。 如有疑問,請在 SQL Database 的 Microsoft Q&A 問題頁面上與我們連絡。如有功能要求,請在 SQL Database 意見反應論壇中新增想法或投票支持現有的想法。