簡體   English   中英

與在執行 SQL 任務中編寫 sql 查詢相比,SSIS 中的數據流任務非常慢

[英]DataFlow task in SSIS is very slow as compared to writing the sql query in Execute SQL task

我是 SSIS 的新手,有兩個問題

  1. 我想將 1,25,000 行從一個表傳輸到同一數據庫中的另一個表。 但是當我使用Data Flow Task ,它花費了太多時間。 我嘗試使用ADO NET DestinationOLE DB Destination但性能不可接受。 當我在Execute SQL Task編寫等效查詢時,它提供了可接受的性能。 為什么性能差別這么大。

    INSERT INTO table1 select * from table2

  2. 根據第一次觀察,我改變了我的包裹。 它完全由使用直接查詢或存儲過程的Execute SQL Tasks組成。 如果我只能使用Execute SQL Task來解決我的問題,那么為什么要像這么多文檔和文章所表明的那樣使用 SSIS。 我認為它可靠、易於維護且速度相對較快。

性能差異

有很多事情可能會導致“直接”數據流任務和等效的執行 SQL 任務的性能。

  1. 網絡延遲。 您正在同一服務器和實例上從表 b 插入表 a。 在執行 SQL 任務中,該工作將完全在同一台機器上執行。 我可以在服務器 B 上運行一個包,從服務器 A 查詢 1.25M 行,然后通過網絡將數據流傳輸到服務器 B。然后這些數據將流回服務器 A 以進行相應的 INSERT 操作。 如果你的網絡很差,數據很寬,尤其是二進制類型,或者服務器之間的距離很遠(服務器 A 在美國,服務器 B 在印度),那么性能就會很差
  2. 內存不足。 假設包與目標/源數據庫在同一台服務器上執行,它仍然可能很慢,因為數據流任務是一個內存引擎。 這意味着,所有將從源流向目的地的數據都將進入內存。 SSIS 獲得的內存越多,運行速度就越快。 但是,它將不得不與操作系統以及 SQL Server 本身爭奪內存分配。 即使 SSIS 是 SQL Server 集成服務,它也不會在與 SQL Server 數據庫相同的內存空間中運行。 如果您的服務器分配了 10GB 的內存,而操作系統使用了 2GB,而 SQL Server 聲稱有 8GB,則 SSIS 幾乎沒有運行空間。 它不能要求 SQL Server 放棄其部分內存,因此操作系統將不得不在數據流通過受限制的數據管道時分頁。
  3. 劣質目的地。 根據您使用的 SSIS 版本,OLE DB 目標的默認訪問模式是“表或視圖”。 這是一個很好的設置,可以嘗試防止低級鎖升級為表鎖。 但是,這會導致行插入(發送 1.25M 唯一插入語句)的痛苦。 將其與Execute SQL Task s INSERT INTO 的基於集合的方法進行對比。 更新版本的 SSIS 默認訪問方法為目標的“快速”版本。 這將表現得更像基於集合的等價物並產生更好的性能。
  4. OLE DB 命令轉換。 有一個OLE DB 目標,有些人將其與OLE DB 命令轉換混淆。 這是兩個非常不同的組件,具有不同的用途。 前者是目的地並消耗所有數據。 它可以進行得非常快。 后者總是RBAR。 它將對流經它的每一行執行單例操作。
  5. 調試。 在 BIDS/SSDT 中運行包存在開銷。 該包執行被包裹在 DTS 調試主機中。 這可能會導致包執行的“非微不足道”減速。 調試器對執行 SQL 任務無能為力——它運行或不運行。 一個數據流,有很多內存可以檢查、監控等,這會減少可用內存量(參見第 2 部分),並且由於它正在執行的各種檢查而減慢了它的速度。 要獲得更准確的比較,請始終從命令行 (dtexec.exe /file MyPackage.dtsx) 運行包或從 SQL Server 代理計划它。

包裝設計

只是Execute SQL Task的 SSIS 包本身沒有任何問題。 如果通過運行查詢可以輕松解決問題,那么我將完全放棄 SSIS 並編寫適當的存儲過程並使用 SQL 代理安排它並完成。

可能是。 即使對於像這樣的“簡單”案例,我仍然喜歡使用 SSIS,因為它可以確保一致的可交付成果。 這可能聽起來不是很多,但是從維護的角度看,它可以很好的了解與該數據包含在這些源控制SSIS包碴一切 我不必記住或培訓新人任務 AC 是“簡單的”,因此它們是從 SQL 代理作業調用的存儲過程。 任務 DJ,或者是 K,甚至比這更簡單,所以它只是代理作業中的“在線”查詢來加載數據,然后我們有其他東西的包。 除了 Service Broker 和一些 Web 服務之外,它們也會更新數據庫。 我年紀越大,接觸的地方越多,我就越能從一致的,即使是矯枉過正的解決方案交付方法中找到價值。

性能不是一切,但 SSIS 團隊確實使用 SSIS 設置了 ETL 基准,因此它絕對有能力快速推送一些數據。

隨着這個答案越來越長,我會簡單地保留它,因為 SSIS 的優勢和直接 TSQL 的數據流是本機的,開箱即用

  • 日志記錄
  • 錯誤處理
  • 配置
  • 並行化

為了我的錢,很難打敗那些。

如果您在參數映射選項卡中將 SSIS 變量作為參數傳遞並通過表達式為這些變量賦值,那么您的執行 SQL 任務會在評估該表達式時消耗大量時間。 使用表達式任務(單獨)分配變量而不是在變量選項卡中使用表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM