管理大量複製批次大小

適用于:SQL Server (所有支援的版本) Azure SQL Database Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)

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

如果大量複製在執行時沒有指定任何批次大小,而且發生了錯誤,則整個大量複製都會回復。 長時間執行的大量複製的復原可能要花一段很長的時間。 如果有設定批次大小,則大量複製會將每個批次視為一筆交易並認可每個批次。 如果發生錯誤,只需要回復最後一個沒有完成的批次。

批次大小也會影響鎖定負擔。 針對SQL Server執行大量複製時,可以使用bcp_control來取得資料表鎖定而非資料列鎖定來指定 TABLOCK 提示。 對於整個大量複製作業而言,設定單一資料表鎖定所需的負擔最低。 如果沒有指定 TABLOCK,則會在個別的資料列上設定鎖定,而在大量複製期間維持所有鎖定的負擔可能會使效能降低。 因為鎖定只會在交易期間設定,所以指定批次大小可以藉由定期產生釋放目前所設定之鎖定的認可來解決這個問題。

在大量複製許多資料列時,組成批次的資料列數可能會對效能造成很大的影響。 批次大小的建議是依所執行之大量複製的類型而定。

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

  • 如果沒有指定 TABLOCK,則將批次大小限制為小於 1,000 資料列。

從資料檔案大量複製時,會先使用 BCPBATCH 選項呼叫 bcp_control ,再呼叫 bcp_exec來指定批次大小。 使用bcp_bindbcp_sendrow從程式變數大量複製時,批次大小是由呼叫bcp_sendrowx次之後呼叫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)