SSIS 數據流數據訪問模式 - “表或視圖”與快速載入有何不同?
使用 SQL Server Business Intelligence Development Studio,我對 OLE DB 目標數據流執行了大量平面文件,以將數據導入我的 SQL Server 表。在 OLE DB 目標編輯器中的“數據訪問模式”下,預設為“表或視圖”而不是“表或視圖 - 快速載入”。有什麼區別; 我能感覺到的唯一明顯區別是快速載入傳輸數據的速度要快得多。
OLE DB 目標組件的數據訪問模式有兩種類型——快速和非快速。
快速,“表或視圖 - 快速載入”或“表或視圖名稱變數 - 快速載入”意味著數據將以基於集合的方式載入。
慢 - “表或視圖”或“表或視圖名稱變數”將導致 SSIS 向數據庫發出單例插入語句。如果您要載入 10、100 甚至 10000 行,那麼這兩種方法之間可能幾乎沒有明顯的性能差異。但是,在某些時候,您將用所有這些微不足道的小請求使 SQL Server 實例飽和。此外,您將濫用事務日誌。
為什麼你會想要非快速方法?不良數據。如果我發送了 10000 行數據並且第 9999 行的日期為 2015-02-29,那麼您將有 10k 原子插入和送出/回滾。如果我使用的是 Fast 方法,那麼整批 10k 行要麼全部保存,要麼都不保存。如果您想知道哪些行出錯,您將擁有的最低粒度級別是 10k 行。
現在,有一些方法可以盡可能快地載入盡可能多的數據,並且仍然可以處理臟數據。這是一種級聯失敗的方法,它看起來像
這個想法是您找到合適的大小以一次性插入盡可能多的數據,但如果您獲得錯誤數據,您將嘗試以連續更小的批次重新保存數據以獲取錯誤行。在這裡,我從 10000 的最大插入送出大小 (FastLoadMaxInsertCommit) 開始。在錯誤行處置中,我將其更改為
Redirect Row
fromFail Component
。下一個目的地與上面相同,但在這裡我嘗試快速載入並將其保存為 100 行的批次。再次,測試或假裝想出一個合理的尺寸。這將導致發送 100 批 100 行,因為我們知道那裡的某個地方,至少有一行違反了表的完整性約束。
然後,我將第三個組件添加到組合中,這次我以 1 個為一組進行保存。或者您可以將表訪問模式從快速載入版本中更改,因為它會產生相同的結果。我們將單獨保存每一行,這將使我們能夠對單個壞行做“某事”。
最後,我有一個故障安全目的地。也許它是與預期目標“相同”的表,但所有列都聲明為
nvarchar(4000) NULL
. 無論最終出現在該表上的什麼,都需要研究和清理/丟棄,或者無論您的不良數據解決過程是什麼。其他人轉儲到一個平面文件,但實際上,無論您想如何跟踪不良數據都有意義。
快速載入在快速載入選項下有很好的記錄
- 保留導入數據文件中的標識值或使用 SQL Server 分配的唯一值。
- 在批量載入操作期間保留空值。
- 在批量導入操作期間檢查目標表或視圖的約束。
- 在批量載入操作期間獲取表級鎖。指定批處理中的行數和送出大小。
有什麼區別; 我能感覺到的唯一明顯區別是快速載入傳輸數據的速度要快得多。
在幕後,
table or view
將使用單獨的 SQL 命令插入每一行,而table or view - with fast load
將使用 BULK INSERT 命令。如果您看到上述BULK INSERT中可用的選項,例如
number of rows in the batch
=ROWS_PER_BATCH
和commit size
=BATCHSIZE
另一種情況是..
預設的最大插入送出大小 (2147483647) 太高。因此,例如,您要插入 500K 行,並且由於 PK 違規,批處理失敗。在這種情況下,當您使用 FAST LOAD 選項時,整個批次都將失敗。您也無法獲得錯誤描述。
這是您可以
table or view
作為目標錯誤輸出的地方。因此,在 500K 中,您使用 FAST LOAD 作為開始,插入送出大小為 5K。如果該批處理中的 1 行失敗,您將重定向那些 5K 批處理以table or view
載入 - 它僅對 5K 行使用逐行插入,您也可以將錯誤重定向table or view
到平面文件.. 這樣如果任何行失敗,批處理如果是 5K,您將能夠查明導致故障的原因。上述方法的優點是,如果沒有一行失敗,那麼它將對整個批次使用 BULK INSERT(快速載入)。
SSIS 愛好者billinkc 在 Stackoverflow 上回答了類似的問題。