Doporučuji číst data po částech:
Místo načítání celé tabulky zkuste data rozdělit na bloky a importovat je na SQL Server. Od chvíle, kdy jsem odpověděl na podobnou odpověď související s SQLite, pokusím se ji reprodukovat, aby odpovídala syntaxi Oracle:
Příručka krok za krokem
V tomto příkladu obsahuje každý blok 10 000 řádků.
- Deklarujte 2 proměnné typu
Int32
(@[User::RowCount]
a@[User::IncrementValue]
) - Přidejte
Execute SQL Task
které provádějíselect Count(*)
a uložte sadu výsledků do proměnné@[User::RowCount]
- Přidejte smyčku For s následujícími preferencemi:
- Do kontejneru cyklu for přidejte
Data flow task
- Do úlohy toku dat přidejte
ODBC Source
aOLEDB Destination
- Ve Zdroji ODBC vyberte
SQL Command
a napišteSELECT * FROM TABLE
dotaz *(pouze pro načtení metadat` - Namapujte sloupce mezi zdrojem a cílem
- Vraťte se do
Control flow
a klikněte naData flow task
a stiskněte F4 pro zobrazení okna vlastností -
V okně vlastností přejděte na výraz a přiřaďte následující výraz
[ODBC Source].[SQLCommand]
vlastnost:(další informace naleznete v části Jak předat proměnné SSIS ve výrazu SQLCommand ODBC?)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
Kde MYTABLE
je název zdrojové tabulky a IDCOLUMN
je váš primární klíč nebo sloupec identity.
Snímek obrazovky Control Flow
Odkazy
- Zdroj ODBC – SQL Server
- Jak předat proměnné SSIS ve výrazu SQLCommand ODBC?
- JAK POUŽÍVAT ZDROJ SSIS ODBC A ROZDÍL MEZI OLE DB A ODBC?
- Jak omezím počet řádků vrácených dotazem Oracle po objednání?
- Získání prvních n až n řádků z db2
Aktualizace 1 – Další možná řešení
Při hledání podobných problémů jsem našel několik dalších řešení, která můžete vyzkoušet:
(1) Změňte maximální paměť SQL Server
-
SSIS:Správce vyrovnávací paměti selhal při volání přidělení paměti
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2) Povolte pojmenované kanály
-
[Opraveno] Správce vyrovnávací paměti zjistil, že v systému je málo virtuální paměti, ale nebyl schopen vyměnit žádné vyrovnávací paměti
- Přejděte na Ovládací panely –> Nástroje pro správu -> Správa počítače
- On Protocol for SQL Instance -> Set Named Pipes =
Enabled
- Restartujte službu instance SQL
- Poté se pokuste data importovat a data budou načtena po částech, místo aby byla načtena všechna najednou. Doufám, že vám to bude fungovat a ušetříte čas.
(3) Pokud používáte SQL Server 2008, nainstalujte opravy hotfix
- Běhový proces SSIS 2008 se zhroutí, když spustíte balíček SSIS 2008 při nedostatku paměti
Aktualizace 2 – Pochopení chyby
V následujícím odkazu MSDN byla příčina chyby popsána následovně:
Virtuální paměť je nadmnožinou fyzické paměti. Procesy ve Windows obvykle neurčují, které mají být použity, protože by to (velmi) bránilo tomu, jak Windows mohou provádět multitasking. SSIS přiděluje virtuální paměť. Pokud to systém Windows umí, jsou všechna tato přidělení uchovávána ve fyzické paměti, kde je přístup rychlejší. Pokud však SSIS požaduje více paměti, než je fyzicky k dispozici, pak se tato virtuální paměť rozlije na disk, takže balíček bude fungovat řádově pomaleji. A v nejhorších případech, pokud v systému není dostatek virtuální paměti, balíček selže.