共用方式為


管理大量複製批次大小

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

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

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

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

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

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

從資料檔進行大量複製時,批次大小是藉由在呼叫 bcp_exec 之前使用 BCPBATCH 選項呼叫 bcp_control 來指定。使用 bcp_bindbcp_sendrow 從程式變數進行大量複製時,批次大小是藉由呼叫 xbcp_sendrow 之後呼叫 bcp_batch 來控制,其中 x 是批次中的資料列數目。

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

批次的另一個副作用是每個批次在以 bcp_batch 完成之前,都會被視為未完成的結果集。如果當批次未完成時在連接控制代碼上嘗試任何其他的作業,SQL Server Native Client ODBC 驅動程式會以 SQLState = "HY000" 發出錯誤以及以下的訊息字串:

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