最佳化大量匯入效能

本主題描述將資料大量匯入至 Microsoft SQL Server 資料表的最佳化選項,其方式是使用 bcp 命令、BULK INSERT 陳述式或 OPENROWSET(BULK...)函數 (Transact-SQL)。若要快速匯入或匯出資料,必須瞭解影響效能的因素,以及可用來管理效能的命令限定詞。如果可能,請使用 Transact-SQL 陳述式來大量匯入資料到 SQL Server,因為 Transact-SQL 比 bcp 還快。

[!附註]

關於這些方法的比較,請參閱<關於大量匯入和大量匯出作業>。

如何最有效增加特定大量匯入作業的效能受到下列因素所影響:

  • 資料表是否含有條件約束或觸發程序,或兩者都有。

  • 資料庫使用的復原模式。

    如需詳細資訊,請參閱<復原模式概觀>。

  • 資料要複製到的資料表是否為空的。

  • 資料表是否有索引。

  • 是否有指定 TABLOCK。

  • 資料是從單一用戶端複製或從多個用戶端平行複製。

  • 是否要在執行 SQL Server 的兩部電腦之間複製資料。

重要事項重要事項

在 SQL Server 2005 及更新的版本中,啟用觸發程序時可使用大量匯入最佳化。資料列版本控制會用於觸發程序,並將資料列版本儲存在 tempdb 的版本存放區內。使用觸發程序大量匯入大批資料記錄之前,您可能需要擴增 tempdb 的大小,以減緩觸發程序對於版本存放區的影響。

如需有關這些因素如何影響大量匯入案例的詳細資訊,請參閱<最佳化大量匯入的指導方針>。

最佳化大量匯入的方法

為了加速大量匯入資料,SQL Server 提供下列方法:

  • 使用最少記錄

    簡單復原模式會以最低限度記錄大部分的大量作業。

    對於使用完整復原模式的資料庫,大量匯入所執行的所有資料列插入作業,都會完整記錄在交易記錄檔中。對於大型資料載入,這可能導致交易記錄檔迅速填滿。若為大量匯入作業,則最少記錄會比完整記錄更有效率,且可降低大量匯入作業填滿記錄空間的可能。若要在資料庫上以最低限度記錄大量匯入作業 (而這個資料庫一般是使用完整復原模式),則您可先將資料庫切換到大量記錄復原模式。大量匯入資料之後,請將復原模式切換回完整復原模式。如需詳細資訊,請參閱<從完整或大量記錄復原模式進行切換的考量>。

    [!附註]

    只有在可以使用最佳化大量記錄時,才能以最低限度記錄插入的資料列;否則,插入的資料列會完整記錄在交易記錄中。如需有關何時記錄大量匯入作業和如何執行最低限度記錄之大量匯入作業的詳細資訊,請參閱<可以進行最低限度記錄的作業>和<大量匯入採用最低限度記錄的必要條件>。

  • 從多個用戶端平行匯入資料至單一資料表

    SQL Server 允許您使用平行方式從多個用戶端大量匯入資料到單一資料表。這三個大量匯入機制都支援平行匯入資料。這可改善資料匯入作業的效能。

    如需詳細資訊,請參閱<使用資料表層級鎖定平行匯入資料>。

  • 使用批次

    如需在匯入資料時使用批次的詳細資訊以及有關用來管理批次的命令限定詞的詳細資訊,請參閱<管理大量匯入的批次>。

    [!附註]

    OPENROWSET 子句的 BULK 選項不支援批次大小的控制。

  • 停用觸發程序

    停用觸發程序可能可改進效能。

    如需有關執行觸發程序對大量匯入作業之影響,以及如何啟用或停用觸發程序的詳細資訊,請參閱<在大量匯入資料時,控制觸發程序的執行>。

  • 停用條件約束

    如需條件約束檢查對於大量匯入作業的影響,以及如何啟用或停用資料表的 CHECK 和 FOREIGN KEY 條件約束的詳細資訊,請參閱<控制大量匯入作業的條件約束檢查>。

  • 資料檔中的資料排序

    依預設,大量匯入作業會假設資料檔並未排序。如果資料表具有叢集索引,使用 bcp 公用程式、BULK INSERT 陳述式和 OPENROWSET(BULK…) 函數 (Transact-SQL) 可讓您指定大量匯入作業期間,要如何排序資料檔中的資料。資料檔中的資料是否要依照資料表的順序進行排序,是選擇性的。不過,如果您指定資料檔與資料表使用相同的排序方式,則可以改進大量匯入作業的效能。

    如需詳細資訊,請參閱<控制大量匯入資料時的排序順序>。

  • 控制鎖定行為

    如需有關如何在大量匯入作業期間指定鎖定行為的詳細資訊,請參閱<控制大量匯入的鎖定行為>。

  • 以原生格式匯入資料

    如需詳細資訊,請參閱<使用原生格式匯入或匯出資料>和<使用 Unicode 原生格式匯入或匯出資料>。