sql >> Database >  >> RDS >> Oracle

SSIS kan pakketten niet opslaan en start Visual Studio opnieuw op

Ik stel voor om gegevens in stukjes te lezen:

In plaats van de hele tabel te laden, kunt u proberen de gegevens in stukken te splitsen en deze in SQL Server te importeren. Sinds een tijdje heb ik een soortgelijk antwoord met betrekking tot SQLite beantwoord, ik zal proberen het te reproduceren zodat het in de Oracle-syntaxis past:

Stap voor stap handleiding

In dit voorbeeld bevat elk blok 10.000 rijen.

  1. Declareer 2 variabelen van het type Int32 (@[User::RowCount] en @[User::IncrementValue] )
  2. Voeg een Execute SQL Task toe die een select Count(*) . uitvoeren commando en sla de resultaatset op in de variabele @[User::RowCount]

  1. Voeg een For Loop toe met de volgende voorkeuren:

  1. Voeg in de for loop-container een Data flow task toe
  2. Voeg binnen de gegevensstroomtaak een ODBC Source toe en OLEDB Destination
  3. Selecteer in de ODBC-bron SQL Command optie en schrijf een SELECT * FROM TABLE query *(alleen om metadata op te halen`
  4. De kolommen tussen bron en bestemming in kaart brengen
  5. Ga terug naar de Control flow en klik op de Data flow task en druk op F4 om het eigenschappenvenster te bekijken
  6. Ga in het eigenschappenvenster naar uitdrukking en wijs de volgende uitdrukking toe aan [ODBC Source].[SQLCommand] eigenschap:(raadpleeg voor meer info SSIS-variabelen doorgeven in ODBC SQLCommand-expressie?)

    "SELECT * FROM MYTABLE ORDER BY ID_COLUMN
    OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
    

Waar MYTABLE is de naam van de brontabel, en IDCOLUMN is uw primaire sleutel of identiteitskolom.

Schermafbeelding controlestroom

Referenties

  • ODBC-bron - SQL Server
  • Hoe SSIS-variabelen doorgeven in ODBC SQLCommand-expressie?
  • HOE DE SSIS ODBC-BRON EN HET VERSCHIL TUSSEN OLE DB EN ODBC GEBRUIKEN?
  • Hoe beperk ik het aantal rijen dat wordt geretourneerd door een Oracle-query na het bestellen?
  • Top n tot n rijen ophalen van db2

Update 1 - Andere mogelijke oplossingen

Tijdens het zoeken naar soortgelijke problemen vond ik enkele aanvullende oplossingen die u kunt proberen:

(1) Wijzig het maximale geheugen van SQL Server

  • SSIS:de bufferbeheerder heeft een geheugentoewijzingsoproep mislukt

    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'max server memory', 4096;
    GO
    RECONFIGURE;
    GO
    

(2) Benoemde buizen inschakelen

  • [Opgelost] De buffermanager ontdekte dat het systeem weinig virtueel geheugen had, maar kon geen buffers verwisselen

    1. Ga naar Configuratiescherm –> Systeembeheer -> Computerbeheer
    2. On Protocol voor SQL-instantie -> Named Pipes instellen =Enabled
    3. Start de SQL-instantieservice opnieuw
    4. Probeer daarna de gegevens te importeren en het zal de gegevens nu in stukjes ophalen in plaats van alles tegelijk op te halen. Ik hoop dat dat voor jullie zal werken en bespaar je tijd.

(3) Als u SQL Server 2008 gebruikt, installeer dan hotfixes

  • Het runtime-proces van SSIS 2008 loopt vast wanneer u het SSIS 2008-pakket uitvoert met weinig geheugen

Update 2 - De fout begrijpen

In de volgende MSDN-link werd de oorzaak van de fout als volgt beschreven:

Virtueel geheugen is een superset van fysiek geheugen. Processen in Windows specificeren meestal niet welke ze moeten gebruiken, omdat dat (zeer) zou belemmeren hoe Windows kan multitasken. SSIS wijst virtueel geheugen toe. Als Windows daartoe in staat is, worden al deze toewijzingen in het fysieke geheugen bewaard, waar de toegang sneller is. Als SSIS echter meer geheugen opvraagt ​​dan fysiek beschikbaar is, dan komt dat virtuele geheugen op de schijf terecht, waardoor het pakket ordes van grootte langzamer werkt. En in het ergste geval, als er niet genoeg virtueel geheugen in het systeem is, zal het pakket mislukken.



  1. Is er een officiële Oracle-aanbeveling over het gebruik van expliciete ANSI JOIN's versus impliciete joins?

  2. in SQLite

  3. Gegevens kopiëren naar een andere tabel

  4. De basisprincipes van het afstemmen van MySQL op dedicated servers