將資料載入 Azure Synapse Analytics 中專用 SQL 集區的最佳做法

在本文中,您可以找到載入資料的建議和效能最佳化。

在 Azure 儲存體中準備資料

若要將延遲降至最低,請共置您的儲存體層和專用 SQL 集區。

將資料匯出成 ORC 檔案格式時,如有大量文字資料行,則可能發生 Java 記憶體不足錯誤。 若要解決這項限制,只能匯出部分資料行。

PolyBase 無法載入具有超過 1 百萬個位元組資料的資料列。 當您將資料放入 Azure Blob 儲存體或 Azure Data Lake Store 中的文字檔案時,這些檔案必須有少於 1 百萬個位元組的資料。 不論資料表結構描為何,此位元組限制皆成立。

每種檔案格式具有不同的效能特性。 若要最快載入,使用壓縮的分隔文字檔案。 UTF-8 和 UTF-16 效能之間的差異最小。

將大型的壓縮檔案分成較小的壓縮檔案。

使用足夠的計算資源執行載入

如需最快的載入速度,一次只執行一項載入作業。 如果不可行,請同時執行數量最少的載入。 如果您預期會有大量載入作業,請考慮在載入前擴大專用 SQL 集區。

若要以適當的計算資源執行載入,請建立為了執行載入而指定的載入使用者。 將每個載入使用者指派給特定的資源類別或工作負載群組。 若要執行載入,請以其中一個載入使用者的身分登入,然後執行載入。 載入會利用使用者的資源類別來執行。 相較於嘗試變更使用者的資源類別,以符合目前的資源類別需求,這個方法比較簡單。

建立載入使用者

這個範例會建立分類至特定工作負載群組的載入使用者。 第一個步驟是連線到 主要資料庫並建立登入。

   -- Connect to master
   CREATE LOGIN loader WITH PASSWORD = 'a123STRONGpassword!';

連線到專用 SQL 集區,並建立使用者。 下列程式碼假設您已連線到名為 mySampleDataWarehouse 的資料庫。 會示範如何建立名為載入者的使用者,並為使用者提供使用 COPY 陳述式建立資料表和載入的權限。 然後,它會將使用者分類為具有最大資源的 DataLoads 工作負載群組。

   -- Connect to the dedicated SQL pool
   CREATE USER loader FOR LOGIN loader;
   GRANT ADMINISTER DATABASE BULK OPERATIONS TO loader;
   GRANT INSERT ON <yourtablename> TO loader;
   GRANT SELECT ON <yourtablename> TO loader;
   GRANT CREATE TABLE TO loader;
   GRANT ALTER ON SCHEMA::dbo TO loader;
   
   CREATE WORKLOAD GROUP DataLoads
   WITH ( 
       MIN_PERCENTAGE_RESOURCE = 0
       ,CAP_PERCENTAGE_RESOURCE = 100
       ,REQUEST_MIN_RESOURCE_GRANT_PERCENT = 100
	);

   CREATE WORKLOAD CLASSIFIER [wgcELTLogin]
   WITH (
	     WORKLOAD_GROUP = 'DataLoads'
       ,MEMBERNAME = 'loader'
   );



重要

這是將 SQL 集區的 100% 資源配置到單一負載的極端範例。 這會為您提供最大並行值 1。 請注意,這應該僅用於初始負載,您必須使用自己的組態來建立額外的工作負載群組,以平衡工作負載之間的資源。

若要使用載入工作負載群組的資源來執行負載,請以載入者身分登入並執行負載。

允許多個使用者載入

通常需要讓多個使用者將資料載入資料倉儲中。 使用 CREATE TABLE AS SELECT (Transact-SQL) 載入所需資料庫的 CONTROL 權限。 CONTROL 權限可控制所有結構描述的存取。 您可能不希望所有的載入使用者都能控制所有結構描述的存取。 若要限制權限,請使用 DENY CONTROL 陳述式。

例如,請考慮將資料庫結構描述 schema_A 用於 dept A 以及 schema_B 用於 dept B,讓資料庫使用者 user_A 和 user_B 個別成為 dept A 及 B 中載入的 PolyBase 之使用者。 這兩個使用者皆已獲得 CONTROL 資料庫權限。 結構描述 A 和 B 的建立者現在是使用 DENY 鎖定其結構描述:

   DENY CONTROL ON SCHEMA :: schema_A TO user_B;
   DENY CONTROL ON SCHEMA :: schema_B TO user_A;

user_A 和 user_B 現在已從其他部門的結構描述加以鎖定。

載入至暫存表格

若要達到以最快載入速度將資料移入資料倉儲資料表中,請將資料載入暫存資料表中。 將暫存資料表定義為堆積,並使用循環配置資源作為散發選項。

請考慮載入通常為兩個步驟的程序,您會先載入至暫存資料表,然後將資料插入生產資料倉儲資料表中。 如果生產資料表使用雜湊散發,您若定義採用雜湊散發的暫存資料表,則載入和插入的總時間可能比較快。 載入至暫存表格所需的時間比較長,但是將資料列插入生產資料表的第二個步驟不會導致資料四處移動。

載入至資料行存放區索引

資料行存放區索引需要大量的記憶體,才能將資料壓縮成高品質的資料列群組。 為了最佳的壓縮和索引效率,資料行存放區索引需要將多達 1,048,576 個資料列壓縮到每個資料列群組中。 當記憶體不足時,資料行存放區索引可能無法達到最大的壓縮率。 這會影響查詢效能。 如需深入探討,請參閱資料行存放區記憶體最佳化

  • 若要確保載入使用者有足夠的記憶體可達到最大的壓縮率,請使用是中型或大型資源類別成員的載入使用者。
  • 載入足夠的資料列,完全填滿新的資料列群組。 在大量載入期間,每 1,048,576 個資料列會以完整資料列群組形式直接壓縮到資料行存放區中。 若載入的資料列少於 102,400 個,則會將資料列傳送至差異存放區,其中的資料列會保存在 b 型樹狀結構索引中。 如果您載入太少資料列,這些資料列可能全都會移至差異存放區,並不會立即壓縮成資料行存放區格式。

使用 SQLBulkCopy API 或 BCP 時,增加批次大小

使用 COPY 陳述式載入將會提供專用 SQL 集區具備的最高輸送量。 如果您無法使用 COPY 來載入,且必須使用 SqLBulkCopy APIbcp,您應考慮增加批次大小以提高輸送量。

提示

介於 10 萬到 1 百萬個資料列之間的批次大小是判斷最佳批次大小容量的建議基準。

管理載入失敗

使用外部資料表的載入可能會失敗,並顯示「查詢已中止 -- 從外部來源讀取時已達最大拒絕閾值」錯誤訊息。 此訊息表示您的外部資料包含「錯誤」記錄。 如果資料類型和資料行數不符合外部資料表的資料行定義,或資料不符合指定的外部檔案格式,則會將資料記錄視為「錯誤」。

若要修正「錯誤」記錄,請確定您的外部資料表及外部檔案格式定義皆正確,且這些定義與您的外部資料相符。 萬一外部資料記錄的子集有錯誤,您可以使用 'CREATE EXTERNAL TABLE' 中的拒絕選項,選擇拒絕這些查詢記錄。

將資料插入生產資料表中

使用 INSERT 陳述式單次載入小型資料表,或甚至定期重新載入查閱,可能會與使用 INSERT INTO MyLookup VALUES (1, 'Type 1') 之類的陳述式有一樣好的效果。 不過,單一插入的效率不如執行大量載入。

如果您整天有數千個或更多單一插入,請將插入分批,以便進行大量載入。 開發將單一插入附加至檔案的程序,然後建立另一個可定期載入檔案的程序。

建立載入後的統計資料

為了改善查詢效能,在首次載入資料或資料發生重大變更之後,建立所有資料表的所有資料行統計資料非常重要。 建立統計資料可以手動完成,也可以啟用自動建立統計資料

如需統計資料的詳細說明,請參閱 統計資料。 下列範例顯示如何在 Customer_Speed 資料表的五個資料行上手動建立統計資料。

create statistics [SensorKey] on [Customer_Speed] ([SensorKey]);
create statistics [CustomerKey] on [Customer_Speed] ([CustomerKey]);
create statistics [GeographyKey] on [Customer_Speed] ([GeographyKey]);
create statistics [Speed] on [Customer_Speed] ([Speed]);
create statistics [YearMeasured] on [Customer_Speed] ([YearMeasured]);

輪替儲存體金鑰

基於安全性考量,請定期變更您 blob 儲存體的存取金鑰。 您的 blob 儲存體帳戶有兩個儲存體金鑰,這可讓您轉換金鑰。

若要輪替 Azure 儲存體帳戶金鑰:

對於金鑰已變更的每個儲存體帳戶,發出 ALTER DATABASE SCOPED CREDENTIAL

範例:

建立原始金鑰

CREATE DATABASE SCOPED CREDENTIAL my_credential WITH IDENTITY = 'my_identity', SECRET = 'key1'

將金鑰從 key 1 輪替為 key 2

ALTER DATABASE SCOPED CREDENTIAL my_credential WITH IDENTITY = 'my_identity', SECRET = 'key2'

不需要對基礎外部資料來源進行其他變更。

下一步