Jeg foreslår, at du læser data i bidder:
I stedet for at indlæse hele tabellen, prøv at opdele dataene i bidder og importere dem til SQL Server. Fra et stykke tid svarede jeg på et lignende svar relateret til SQLite, jeg vil prøve at gengive det, så det passer til Oracle-syntaksen:
Trin for trin guide
I dette eksempel indeholder hver chunk 10000 rækker.
- Deklarer 2 variabler af typen
Int32
(@[User::RowCount]
og@[User::IncrementValue]
) - Tilføj en
Execute SQL Task
der udfører enselect Count(*)
kommandoen og gem resultatsættet i variablen@[User::RowCount]
- Tilføj en For Loop med følgende præferencer:
- Tilføj en
Data flow task
i for-loop-beholderen - Tilføj en
ODBC Source
i dataflowopgaven ogOLEDB Destination
- Vælg
SQL Command
i ODBC-kilden og skriv enSELECT * FROM TABLE
forespørgsel *(kun for at hente metadata` - Kortlæg kolonnerne mellem kilde og destination
- Gå tilbage til
Control flow
og klik påData flow task
og tryk på F4 for at se egenskabsvinduet -
I egenskabsvinduet skal du gå til udtryk og tildele følgende udtryk til
[ODBC Source].[SQLCommand]
egenskab:(for mere information henvises til Sådan overføres SSIS-variabler i ODBC SQLCommand-udtryk?)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
Hvor MYTABLE
er kildetabelnavnet og IDCOLUMN
er din primære nøgle eller identitetskolonne.
Skærmbillede af kontrolflow
Referencer
- ODBC-kilde - SQL Server
- Hvordan sender man SSIS-variabler i ODBC SQLCommand-udtryk?
- HVORDAN BRUGES SSIS ODBC-KILDE OG FORSKEL MELLEM OLE DB OG ODBC?
- Hvordan begrænser jeg antallet af rækker, der returneres af en Oracle-forespørgsel efter bestilling?
- Få top n til n rækker fra db2
Opdatering 1 - Andre mulige løsninger
Mens jeg søgte efter lignende problemer, fandt jeg nogle yderligere løsninger, som du kan prøve:
(1) Skift SQL Server max hukommelse
-
SSIS:Buffer Manager mislykkedes i et hukommelsestildelingsopkald
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2) Aktiver navngivne rør
-
[Fixed] Buffermanageren registrerede, at systemet havde lav virtuel hukommelse, men var ikke i stand til at udskifte nogen buffere
- Gå til Kontrolpanel –> Administrative værktøjer -> Computerstyring
- On Protocol for SQL Instance -> Set Named Pipes =
Enabled
- Genstart SQL-instanstjenesten
- Prøv derefter at importere dataene, og det vil hente dataene i bidder nu i stedet for at hente dem på én gang. Håber det vil virke for jer og spare tid.
(3) Installer hotfixes, hvis du bruger SQL Server 2008
- SSIS 2008 runtime-processen går ned, når du kører SSIS 2008-pakken under en tilstand med lav hukommelse
Opdatering 2 - Forstå fejlen
I det følgende MSDN-link blev fejlårsagen beskrevet som følgende:
Virtuel hukommelse er et supersæt af fysisk hukommelse. Processer i Windows specificerer typisk ikke, hvilke de skal bruge, da det (i høj grad) ville hæmme, hvordan Windows kan multitaske. SSIS tildeler virtuel hukommelse. Hvis Windows er i stand til det, opbevares alle disse tildelinger i fysisk hukommelse, hvor adgangen er hurtigere. Men hvis SSIS anmoder om mere hukommelse, end der er fysisk tilgængeligt, så spildes den virtuelle hukommelse til disken, hvilket får pakken til at arbejde i størrelsesordener langsommere. Og i værste tilfælde, hvis der ikke er nok virtuel hukommelse i systemet, så vil pakken fejle.