使用彈性資料庫工具進行多分區查詢

適用于:Azure SQL資料庫

概觀

使用彈性資料庫工具,您可以建立分區化資料庫解決方案。 多分區查詢用於資料收集/報告等工作,這些工作需要跨越數個分區執行查詢。 (這與在單一分區上執行所有工作的資料相依路由相反。)

  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) 類別,以檢視結果。

範例

下列程式碼說明如何使用給定的 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 問與答的問題頁面上與我們連絡。如有功能要求,請在 SQL Database 意見反應論壇中新增想法或投票支持現有的想法。