管理大量複製批次大小

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

大量複製作業中批次的主要目的是定義交易的範圍。 如果未設定批次大小,則大量複製函式會將整個大量複製視為一筆交易。 如果已設定批次大小,則每個批次都會構成批次完成時認可的交易。

如果未指定批次大小且發生錯誤,就會執行大量複製,則會回復整個大量複製。 長時間執行大量複製的復原可能需要很長的時間。 設定批次大小時,大量複製會將每個批次視為交易,並認可每個批次。 如果遇到錯誤,則只需要回復最後一個未處理的批次。

批次大小也會影響鎖定額外負荷。 對 SQL Server 執行大量複製時,可以使用 bcp_control 來指定 TABLOCK 提示,以取得資料表鎖定,而不是資料列鎖定。 對於整個大量複製作業,單一資料表鎖定可以保留最少的額外負荷。 如果未指定 TABLOCK,則會保留個別資料列的鎖定,而維護大量複製期間所有鎖定的額外負荷可能會降低效能。 因為鎖定只保留交易的長度,因此指定批次大小可藉由定期產生釋放目前保留鎖定的認可來解決此問題。

大量複製大量資料列時,組成批次的資料列數目可能會有顯著的效能影響。 批次大小的建議取決於要執行的大量複製類型。

  • 大量複製到 SQL Server 時,請指定 TABLOCK 大量複製提示,並設定大型批次大小。

  • 如果未指定 TABLOCK,請將批次大小限制為小於 1,000 個數據列。

從資料檔案大量複製時,會先使用 BCPBATCH 選項呼叫 bcp_control,再呼叫 bcp_exec 來指定批次大小。 使用 bcp_bind 和 bcp_sendrow 從程式變數大量複製時,批次大小是由呼叫 bcp_sendrow x 次之後呼叫 bcp_batch 來控制,其中 x 是批次中的資料列數目。

除了指定交易的大小之外,批次也會影響當資料列透過網路傳送到伺服器時。 大量複製函式通常會從 bcp_sendrow 快取資料列,直到網路封包填滿為止,然後將完整封包傳送至伺服器。 不過,當應用程式呼叫 bcp_batch 時,不論目前封包是否已填滿,都會傳送至伺服器。 如果使用非常低的批次大小,會導致將許多部分填滿的封包傳送至伺服器,效能可能會變慢。 例如,在每個bcp_sendrow之後呼叫 bcp_batch 會導致每個 資料列以個別封包傳送,除非資料列非常大,否則會浪費每個封包的空間。 SQL Server 的網路封包預設大小為 4 KB,不過應用程式可以藉由呼叫 指定 SQL_ATTR_PACKET_SIZE 屬性的 SQLSetConnectAttr 來變更大小。

批次的另一個副作用是,每個批次都會被視為未完成 的結果集,直到完成bcp_batch 為止。 如果在批次未完成時嘗試連線控制碼上的任何其他作業,SQL Server Native Client ODBC 驅動程式就會發出 SQLState = 「HY000」 的錯誤,併發出錯誤訊息字串:

"[Microsoft][SQL Server Native Client] Connection is busy with  
results for another hstmt."  

另請參閱

執行大量複製作業 (ODBC)
資料的大量匯入及匯出 (SQL Server)