sql >> Databasteknik >  >> RDS >> Oracle

SSIS misslyckas med att spara paket och startar om Visual Studio

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.

  1. Deklarera 2 variabler av typen Int32 (@[User::RowCount] och @[User::IncrementValue] )
  2. Lägg till en Execute SQL Task som kör en select Count(*) kommandot och lagra resultatuppsättningen i variabeln @[User::RowCount]

  1. Lägg till en For Loop med följande inställningar:

  1. Inuti for loop-behållaren lägg till en Data flow task
  2. Inuti dataflödesuppgiften lägg till en ODBC Source och OLEDB Destination
  3. Välj SQL Command i ODBC-källan alternativet och skriv en SELECT * FROM TABLE fråga *(för att endast hämta metadata`
  4. Karta kolumnerna mellan källa och destination
  5. Gå tillbaka till Control flow och klicka på Data flow task och tryck på F4 för att visa egenskapsfönstret
  6. 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

    1. Gå till Kontrollpanelen –> Administrativa verktyg -> Datorhantering
    2. On Protocol for SQL Instance -> Set Named Pipes =Enabled
    3. Starta om SQL-instanstjänsten
    4. 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.



  1. Hur man hittar en användares standardspråk i SQL Server (T-SQL)

  2. Ett förberett uttalande, `WHERE .. IN(..)`-fråga och sortering - med MySQL

  3. Hur får man tabellskript i Oracle SQL Developer?

  4. Lista alla tabeller i postgresql informationsschema