使用資料表層級鎖定平行匯入資料
MicrosoftSQL Server 可讓多重用戶端「以平行方式大量匯入資料」至單一未編製索引的資料表。這樣可以改善大量匯入作業的效能。三個大量匯入命令全都支援平行資料匯入:bcp、BULK INSERT 和 INSERT ...SELECT * FROM OPENROWSET(BULK...)。
[!附註]
只有使用 ODBC 型或 SQL OLE DB 型 API 的應用程式,可以執行平行的資料載入作業到單一資料表中。任何以 MicrosoftSQL Server 6.5 或舊版所提供 DB-Library 用戶端程式庫為基礎的應用程式 (包括 bcp 公用程式),都無法參與將資料平行載入到 SQL Server 執行個體中。
如果您沒有指定 TABLOCK 選項/提示,則多重並行大量匯入資料流會在資料表層級之下的資料粒度上取得鎖定。根據資料分散情形而定,並行大量載入資料流可能會互相封鎖。因此,以平行方式大量匯入資料到未編製索引的資料表中,通常是以 TABLOCK 來執行。
若要使用 TABLOCK 將資料以平行方式大量匯入 SQL Server 執行個體,請考量以下事項:
以平行方式匯入資料最簡單的狀況是將資料載入未編製索引的資料表 (「堆積」)。
如果資料表沒有索引,請為大量匯入作業指定 TABLOCK 選項。如需詳細資訊,請參閱<控制大量匯入的鎖定行為>。
[!附註]
當資料表中存在索引時,就無法使用 TABLOCK 選項來執行平行載入作業。同時,如果未指定 TABLOCK,並行執行緒會彼此封鎖。在大量匯入作業之前,請考慮從資料表移除索引。如需是否要保留或移除索引的詳細資訊,請參閱<最佳化大量匯入的指導方針>。
將用戶端之間要匯入的資料分成和用戶端一樣數目的資料檔。將每個檔案放在各個用戶端上。
最佳作法 若要以最有效率的方式使用處理器,請將檔案平均分散到所有用戶端。如果您想將資料檔從多重用戶端以平行方式匯入至 SQL Server 的執行個體,請確定這些資料檔的大小類似。否則,負載較輕的用戶端執行緒可能會提早結束,因此無法有效率地使用該用戶端的 CPU。
若要達到最大效能,為每個用戶端指定的批次大小應該與用戶端資料檔的大小相同。如需詳細資訊,請參閱<管理大量匯入的批次>。
將資料大量匯入至資料表之後,您可以建立任何必要的索引,如下所示:
如果您未指定 TABLOCK,您可以平行方式大量匯入資料,而不必管目標上的索引數。但在此案例中,大量最佳化不可行,且您可能在取得個別資料列或頁面的鎖定時遭到封鎖。