關於大量匯入和大量匯出作業
SQL Server 支援從 SQL Server 資料表大量匯出資料,以及將資料大量匯入 SQL Server 資料表或非資料分割的檢視。有下列基本方法可用。
方法 |
描述 |
匯入資料 |
匯出資料 |
---|---|---|---|
可大量匯出和大量匯入資料並產生格式檔案的命令列公用程式 (Bcp.exe)。 |
是 |
是 |
|
Transact-SQL 陳述式,可將資料直接從資料檔案匯入至資料庫資料表或非資料分割的檢視。 |
是 |
否 |
|
Transact-SQL 陳述式,其指定 OPENROWSET(BULK…) 函數選取 INSERT 陳述式中的資料,以使用 OPENROWSET 大量資料列集提供者,將資料大量匯入 SQL Server 資料表。 |
是 |
否 |
限制
SQL Server 大量匯入作業不支援從逗號分隔值 (CSV) 檔案匯入資料。不過,在 32 位元系統上,您可以搭配 OLE DB Provider for Jet 使用 OPENROWSET,將 CSV 資料匯入 SQL Server 資料表,而不需要將大量匯入最佳化。Jet 會將文字檔視為資料表,其中包含與資料來源位於相同目錄中之 schema.ini 檔所定義的結構描述。若是 CSV 資料,schema.ini 檔中的其中一個參數將會是 "FORMAT=CSVDelimited"。若要使用此解決方案,您需要了解 Jet Test IISAMm 如何運作 (其連接字串語法、schema.ini 用法、登錄設定選項等等)。此資訊的最佳來源為 Microsoft Access 說明以及知識庫 (KB) 文件。如需詳細資訊,請參閱<初始化文字資料來源驅動程式>(英文)、<如何搭配安全保護 Access 資料庫的連結伺服器使用 SQL Server 7.0 分散式查詢>、<HOW TO:使用 Jet OLE DB Provider 4.0 連接到 ISAM 資料庫>(機器翻譯) 以及<如何使用 Jet 提供者的文字開啟分隔的文字檔案>(機器翻譯)。
同處理序與跨處理序的作業
BULK INSERT 陳述式 和 OPENROWSET(BULK) 函數與 SQL Server 執行於同處理序,共用相同的記憶體位址空間。因為資料檔是由 SQL Server 處理序所開啟,因此在用戶端處理序和 SQL Server 處理序之間並不會複製資料。如需有關使用 BULK INSERT 或 INSERT ...SELECT * FROM OPENROWSET(BULK...) 匯入資料時的安全性考量,請參閱<使用 BULK INSERT 或 OPENROWSET(BULK...) 匯入大量資料>。
相反地,bcp 公用程式會跨處理序執行。若要在處理序記憶體空間之間移動資料,bcp 必須使用「處理序間資料封送處理」。「處理序間資料封送處理」是將方法呼叫的參數轉換成位元組資料流的程序。這會大量增加處理器的負擔。不過,因為 bcp 會剖析資料並在用戶端處理序中將資料轉換成原生儲存格式,所以可以從 SQL Server 處理序中卸載剖析和資料轉換。因此,如果您有 CPU 限制,可以在有不只一個 CPU 的電腦上,或在不同電腦上使用 bcp 來獲得較佳的大量匯入效能,而不要使用 BULK INSERT 或 INSERT ...SELECT * FROM OPENROWSET(BULK)。
格式檔案
bcp 公用程式、BULK INSERT 和 INSERT ...SELECT * FROM OPENROWSET(BULK...)全都支援使用特殊的「格式檔案」(Format File),以儲存資料檔案中每一個欄位的格式資訊。格式檔案也可以包含對應的 SQL Server 資料表的相關資訊。對 SQL Server 執行個體大量匯出與大量匯入資料時,格式檔案可以提供所需的所有格式資訊。
格式檔案提供彈性方式,在匯入期間用於解譯資料檔中的資料,以及在匯出期間用於格式化資料檔中的資料。這樣的彈性讓您不需撰寫特殊用途的程式碼來解譯資料,也不需因應 SQL Server 或外部應用程式的特定需求將資料重新格式化。例如,如果您大量匯出的資料即將要載入到需要逗號分隔值的應用程式中,則可以使用格式檔案,在匯出的資料中插入逗號當做欄位結束字元。
SQL Server 2005 及更新的版本支援下列兩種類型的格式檔案:XML 格式檔案和非 XML 格式檔案。舊版的 SQL Server 支援非 XML 格式檔案;XML 格式檔案則是 SQL Server 2005 的新功能。
bcp 公用程式是唯一可以產生格式檔案的工具。如需詳細資訊,請參閱<建立格式檔案>。如需有關格式檔案的詳細資訊,請參閱<用於匯入或匯出資料的格式檔案>。
[!附註]
萬一在大量匯出或匯入作業期間未提供格式檔案,使用者可以選擇在命令列覆寫預設格式。
查詢處理器和大量匯入
為了將資料大量匯入 SQL Server 的執行個體,bcp 公用程式、BULK INSERT 陳述式和 INSERT ...SELECT * FROM OPENROWSET(BULK...)陳述式都會搭配查詢處理器使用。
這三個方法都會將資料檔案中的資料轉換成 OLE DB 資料列集。但是轉換方法各有不同,如下所述:
bcp 公用程式讀取資料檔案,並將 TDS 資料流傳送至 SQL Server 大量複製程式 (BCP) API,此 API 便會將資料轉換為 OLE DB 資料列集。
BULK INSERT 和 OPENROWSET 大量資料列集提供者都會將檔案資料直接轉換為 OLE DB 資料列集。
查詢處理器會將 OLE DB 資料列集插入目標資料表中,並自行規劃及最佳化每一項作業。
效能考量
當有大量資料要匯入時,效能考量因素也就顯得相當重要。在某些情況下,變更大量匯入或大量匯出作業處理下列其中一項或多項的方式,將可以改進效能:
批次參數
CHECK 條件約束的條件約束檢查
記錄大量交易的方式。這與通常使用完整復原模式的資料庫有關。
排序匯出的資料
平行資料匯入
資料表鎖定
觸發程序執行
如需詳細資訊,請參閱<最佳化大量匯入效能>。
[!附註]
大量匯出作業並沒有什麼特別的最佳化技術。這些作業不過是使用 SELECT 陳述式,從來源資料表中選取資料而已。