Jag föreslår att du läser data i bitar:
Istället för att ladda hela tabellen, försök att dela upp data i bitar och importera dem till SQL Server. Sedan ett tag har jag svarat på ett liknande svar relaterat till SQLite, jag ska försöka återskapa det för att passa Oracle-syntaxen:
Steg-för-steg-guide
I det här exemplet innehåller varje del 10 000 rader.
- Deklarera 2 variabler av typen
Int32
(@[User::RowCount]
och@[User::IncrementValue]
) - Lägg till en
Execute SQL Task
som kör enselect Count(*)
kommandot och lagra resultatuppsättningen i variabeln@[User::RowCount]
- Lägg till en For Loop med följande inställningar:
- Inuti for loop-behållaren lägg till en
Data flow task
- Inuti dataflödesuppgiften lägg till en
ODBC Source
ochOLEDB Destination
- Välj
SQL Command
i ODBC-källan alternativet och skriv enSELECT * FROM TABLE
fråga *(för att endast hämta metadata` - Karta kolumnerna mellan källa och destination
- Gå tillbaka till
Control flow
och klicka påData flow task
och tryck på F4 för att visa egenskapsfönstret -
I egenskapsfönstret gå till uttryck och tilldela följande uttryck till
[ODBC Source].[SQLCommand]
egenskap:(för mer information se Hur skickar man SSIS-variabler i ODBC SQLCommand-uttryck?)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
Där MYTABLE
är källtabellens namn och IDCOLUMN
är din primära nyckel eller identitetskolumn.
Skärmdump för kontrollflöde
Referenser
- ODBC-källa - SQL Server
- Hur skickar man SSIS-variabler i ODBC SQLCommand-uttryck?
- HUR ANVÄNDER MAN SSIS ODBC-KÄLLA OCH SKILLNADEN MELLAN OLE DB OCH ODBC?
- Hur begränsar jag antalet rader som returneras av en Oracle-fråga efter beställning?
- Hämta topp n till n rader från db2
Uppdatering 1 – Andra möjliga lösningar
När jag letade efter liknande problem hittade jag några ytterligare lösningar som du kan prova:
(1) Ändra SQL Server max minne
-
SSIS:Bufferthanteraren misslyckades med ett minnesallokeringsanrop
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2) Aktivera namngivna rör
-
[Fixat] Bufferthanteraren upptäckte att systemet hade lite virtuellt minne, men kunde inte byta ut några buffertar
- Gå till Kontrollpanelen –> Administrativa verktyg -> Datorhantering
- On Protocol for SQL Instance -> Set Named Pipes =
Enabled
- Starta om SQL-instanstjänsten
- Försök sedan att importera data och det kommer att hämta data i bitar nu istället för att hämta allt på en gång. Hoppas det kommer att fungera för er och spara tid.
(3) Om du använder SQL Server 2008 installera snabbkorrigeringar
- SSIS 2008 runtime-processen kraschar när du kör SSIS 2008-paketet med lågt minne
Uppdatering 2 - Förstå felet
I följande MSDN-länk beskrevs felorsaken enligt följande:
Virtuellt minne är en superuppsättning av fysiskt minne. Processer i Windows anger vanligtvis inte vilka de ska använda, eftersom det (avsevärt) skulle hämma hur Windows kan multitaska. SSIS allokerar virtuellt minne. Om Windows kan, lagras alla dessa tilldelningar i fysiskt minne, där åtkomsten är snabbare. Men om SSIS begär mer minne än vad som är fysiskt tillgängligt, spills det virtuella minnet till disken, vilket gör att paketet fungerar långsammare i storleksordningar. Och i värsta fall, om det inte finns tillräckligt med virtuellt minne i systemet, kommer paketet att misslyckas.