Предлагам да четете данните на парчета:
Вместо да зареждате цялата таблица, опитайте се да разделите данните на парчета и да ги импортирате в SQL Server. От известно време отговорих на подобен отговор, свързан със SQLite, ще се опитам да го възпроизведа, за да пасне на синтаксиса на Oracle:
Ръководство стъпка по стъпка
В този пример всяка част съдържа 10 000 реда.
- Декларирайте 2 променливи от тип
Int32
(@[User::RowCount]
и@[User::IncrementValue]
) - Добавете
Execute SQL Task
които изпълняватselect Count(*)
команда и запишете набора от резултати в променливата@[User::RowCount]
- Добавете For Loop със следните предпочитания:
- Вътре в контейнера на цикъла for добавете
Data flow task
- Вътре в задачата за поток от данни добавете
ODBC Source
иOLEDB Destination
- В източника на ODBC изберете
SQL Command
опция и напишетеSELECT * FROM TABLE
заявка *(за извличане само на метаданни` - Определете колоните между източник и местоназначение
- Върнете се към
Control flow
и щракнете върхуData flow task
и натиснете F4 за да видите прозореца със свойства -
В прозореца със свойства отидете на израз и Задайте следния израз на
[ODBC Source].[SQLCommand]
свойство:(за повече информация вижте Как да предадете SSIS променливи в ODBC SQLCommand израз?)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
Къде MYTABLE
е името на таблицата източник и IDCOLUMN
е вашият първичен ключ или колона за идентичност.
Екранна снимка на контролния поток
Препратки
- ODBC източник – SQL сървър
- Как да предавам SSIS променливи в ODBC SQLCommand израз?
- КАК ДА ИЗПОЛЗВАМ SSIS ODBC ИЗТОЧНИК И РАЗЛИКА МЕЖДУ OLE DB И ODBC?
- Как да огранича броя на редовете, върнати от заявка на Oracle след поръчка?
- Получаване на първите n до n реда от db2
Актуализация 1 – Други възможни решения
Докато търсех подобни проблеми, намерих някои допълнителни решения, които можете да опитате:
(1) Променете максималната памет на SQL Server
-
SSIS:Мениджърът на буфера не успя да извика за разпределяне на памет
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2) Активиране на наречени тръби
-
[Коригирано] Мениджърът на буфери откри, че системата е с малко виртуална памет, но не е в състояние да размени никакви буфери
- Отидете на Контролен панел –> Административни инструменти -> Управление на компютъра
- По протокол за SQL екземпляр -> Задаване на именувани тръби =
Enabled
- Рестартирайте услугата за SQL екземпляр
- След това опитайте да импортирате данните и той ще извлече данните на парчета сега, вместо да извлече всички наведнъж. Надяваме се, че това ще свърши работа за вас и ще ви спести време.
(3) Ако използвате SQL Server 2008, инсталирайте спешни корекции
- Процесът по време на изпълнение на SSIS 2008 се срива, когато стартирате пакета SSIS 2008 при условие на ниско ниво на памет
Актуализация 2 – Разбиране на грешката
В следната MSDN връзка причината за грешката беше описана по следния начин:
Виртуалната памет е супернабор от физическа памет. Процесите в Windows обикновено не уточняват кои трябва да се използват, тъй като това (много) би попречило на това как Windows може да изпълнява много задачи. SSIS разпределя виртуална памет. Ако Windows е в състояние, всички тези разпределения се съхраняват във физическата памет, където достъпът е по-бърз. Въпреки това, ако SSIS поиска повече памет, отколкото е физически налична, тогава тази виртуална памет се разлива на диск, което кара пакета да работи с порядък по-бавно. И в най-лошите случаи, ако няма достатъчно виртуална памет в системата, пакетът ще се провали.