Sql-Server

用於直接插入速度性能的 TSQL 或 SSIS

  • January 8, 2019

我將數據從表 A 移動到表 B。表具有完全相同的 DDL、表結構,並且是直接插入。我們不會轉換或修改數據。

如果 TSQL Server 和 SSIS 的 cpu 核心和記憶體具有相同的硬體規格,並且這兩個表駐留在同一個數據庫中,那麼哪個工具的性能更好?表是 5000 萬行,大約 30GB。

我們的性能測試顯示T-sql;我想確認 Microsoft 或供應商的建議。

問題的目的是了解 Tsql 和 ssis 之間的速度差異。

簡要引用文件

Microsoft Integration Services 是一個用於建構企業級數據集成和數據轉換解決方案的平台。使用集成服務通過複製或下載文件、載入數據倉庫、清理和探勘數據以及管理 SQL Server 對象和數據來解決複雜的業務問題。

Integration Services 可以從各種源(例如 XML 數據文件、平面文件和關係數據源)中提取和轉換數據,然後將數據載入到一個或多個目標。

您說您正在將數據從同一個數據庫中的一個表載入到另一個表,而無需進行轉換。SSIS 並不是真正適合這項工作的工具。使用合理的表結構,正確編寫的 T-SQL 插入將比通過 SSIS 載入執行得更好,因為您避免了將數據發送到另一台伺服器、通過緩衝區傳遞數據並將其發送回目標伺服器的成本。在幕後,SSIS 只是在做BULK INSERTINSERT ,除了邊緣情況外,它不會比 T-SQL 快。

為了給出完整的答案,我將描述 SSIS 的一些特性,這些特性從數據載入性能的角度來看可能會有所幫助。考慮 SQL Server 中的一個表,該表具有復雜的五列聚集索引和許多非聚集索引。假設您不能禁用 NCI。通過將插入拆分成批次,您可能會獲得最佳的載入性能,因為較小的排序將用於進行 NCI 維護。使用五列聚集鍵在 SQL Server 中編寫高效的批處理解決方案可能很困難。然而,這在 SSIS 中是微不足道的。SSIS 可以按順序讀取數據,只需更改參數即可為您將數據拆分成批次。因此,在這種情況下,您可能會使用 SSIS 獲得更好的性能,因為 T-SQL 程式碼沒有盡可能高效地編寫。

再舉一個例子,aBULK INSERT能夠在目標堆上獲取 BU 鎖。BU 鎖與其他 BU 鎖兼容。因此,您可以獲得多個並發 T-SQL 插入所有載入最少記錄的數據到同一個堆中而不會阻塞。僅靠 T-SQL 無法做到這一點。BU 鎖在該上下文中不可用。SQL Server 2017 在 T-SQL 的堆中提供並行插入,因此當從具有相同結構的表中載入數據時,BU 鎖的好處會減弱。BU 鎖優於 T-SQL 中的任何內容的一個範例是從具有聚集索引的表載入到 SQL Server 2014 標準版上的堆中。在 T-SQL 中,您一次只能執行一個插入,但在 SSIS 中,您可以執行許多並發插入。

總之,對於您所描述的場景,SSIS 幾乎肯定是錯誤的工具。除了少數邊緣情況外,您應該期望看到正確編寫的 T-SQL 程式碼具有更好的性能,因為它避免了在伺服器之間移動數據所固有的成本。

引用自:https://dba.stackexchange.com/questions/226476