Ssis

使用 SQL 命令載入 SSIS

  • September 29, 2014

我正在嘗試使用 SSIS 插入以下查詢。我這樣做只是因為目標表中已經存在一些重疊的 ID。我嘗試使用以下方法獲取兩個表的最小和最大 ID,以便僅插入不存在的行:

/*
--SourceTable
MinID  MaxID
select 552596452-633166940

--destination table
MinID        MaxID
450485204  596693972
*/

然後我現在用它來實現使用 SSIS 包的插入。我無法讓這個包執行。有什麼我做錯了嗎?是否有任何其他 SSIS 數據流可用於解決此問題?我選擇使用 SSIS 是因為記錄大約有 3000 萬行,在 SQL 上執行需要很長時間,而且它也會很快填滿日誌空間,這會影響伺服器的性能。

INSERT INTO dbo.destinationtable          
          ([id]      
          ,[userId]      
          ,[serviceId]      
          ,[keyId]      
          ,[wappush]      
          ,[builturl]      
          ,[datestamp]      
          ,[pocessingTime]      
          ,[UserAgent]      
          ,[Referer]      
          ,[fallBack]      
          ,[Error]
          ,[ClientIP]
          ,[AdvertUrl])  


SELECT  id, userId, serviceId, keyId, wappush, builturl, datestamp, pocessingTime, 
         UserAgent, Referer, fallBack, Error, ClientIP, AdvertUrl
FROM  sourcetable a (nolock)
WHERE (datestamp < DATEADD(d, 0, DATEDIFF(d, 0, GETDATE() - 60))) 
AND id > 596693972 and id <= 633166940
ORDER BY id

如果你打算使用 SSIS,我可以建議你使用它嗎?;)

我相信您正在嘗試做的是插入一些目標中尚不存在的數據。您已經使用最小/最大邏輯確定了需要哪些數據,並嘗試對目標執行類似的操作。

對於初學者來說,這OLE DB Command是你應該謹慎使用的東西。它執行單例操作,因此您希望這個東西處理的行數應該是幾十,也許是幾百。絕對不是8000萬。

您的數據流應該是這樣的

在此處輸入圖像描述

我有一個 OLE DB 源(可以使用 ADO.NET,但如果您需要參數化查詢,它會稍微複雜一些)。您可以使用現有的查詢,或者如果您需要將其分塊,因為您有活動的系統,就這樣吧。

查找組件LKP RM_DimEmplo...是此操作的關鍵。當包啟動時,它將在該組件中執行源查詢並記憶體所有值。這聽起來很貴,所以不要讓它成為現實。不要只選擇dbo.destinationTable. 編寫查詢以僅返回進行匹配所需的鍵。應該是那些ID。那將非常狹窄,不應該那麼糟糕。這裡的想法是您將擁有源行,並根據這些鍵將它們與目標表的記憶體進行比較。由於您不擔心檢測差異,因此您知道任何匹配的內容都需要刪除,因此在“正常”選項卡上,將“指定如何處理沒有匹配條目的行”更改為使用Redirect rows to no match output.否則,當它不匹配時,它會爆炸。

如果您發現它仍然對您的系統有影響,那麼您需要採用更高級的方法,即在查找組件上使用表達式來過濾數據范圍以匹配傳入的 ID。因此,您已確定源範圍為 100到 200。沒有必要在目標中提取完整的 0 到 1000 範圍的鍵,您只需讓查找記憶體在操作範圍內的鍵。除非您的機器上沒有可用的 RAM,否則 80M 應該不會太重。

執行OLE DB Command單例、一次性操作。OLE DB Destination可以執行單例插入(預設為 2005 - )Table or view或基於集合/批處理的更新(Table or View - fast load),這可以快速尖叫獵豹車輪。由於您正在載入大量數據,除非您希望您的管理員討厭您,否則將 Max insert commit size 更改為預設值 2147483647 以外的其他值。這基本上是說在全部插入之前不要送出任何內容。這可能會導致您的事務日誌匆忙變大。

你的問題的好處是你可以隨心所欲地執行它。假設 1M 行被載入並且發生了一些不好的事情。只需重新啟動。不管送出了多少,當它重新啟動時,它可能會提取相同的源數據,但您的查找將具有來自目標的最新鍵集,因此結果將不會對這些鍵執行任何操作。我知道,你會認為每個人都喜歡他們的目標系統中的重複項,但出於某種原因,這在某些地方並不適用……

包起來

我不能足夠推薦集成服務系列的階梯。專門針對這個問題,Level 3

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