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.
- Declareer 2 variabelen van het type
Int32
(@[User::RowCount]
en@[User::IncrementValue]
) - Voeg een
Execute SQL Task
toe die eenselect Count(*)
. uitvoeren commando en sla de resultaatset op in de variabele@[User::RowCount]
- Voeg een For Loop toe met de volgende voorkeuren:
- Voeg in de for loop-container een
Data flow task
toe - Voeg binnen de gegevensstroomtaak een
ODBC Source
toe enOLEDB Destination
- Selecteer in de ODBC-bron
SQL Command
optie en schrijf eenSELECT * FROM TABLE
query *(alleen om metadata op te halen` - De kolommen tussen bron en bestemming in kaart brengen
- Ga terug naar de
Control flow
en klik op deData flow task
en druk op F4 om het eigenschappenvenster te bekijken -
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
- Ga naar Configuratiescherm –> Systeembeheer -> Computerbeheer
- On Protocol voor SQL-instantie -> Named Pipes instellen =
Enabled
- Start de SQL-instantieservice opnieuw
- 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.