Чтение огромного объема данных из Sqlite в SQL Server завершается неудачно при предварительном выполнении - PullRequest
0 голосов
/ 13 января 2019

У меня есть огромная (26 ГБ) база данных sqlite, которую я хочу импортировать в SQL Server с SSIS.

У меня все настроено правильно. Некоторые потоки данных работают правильно и импортируют данные.

Потоки данных просты. Они просто состоят из источника и пункта назначения.

Но когда дело доходит до таблицы с 80 миллионами строк, поток данных завершается неудачно с этим бесполезным сообщением:

Код: 0xC0047062
Источник: Задача потока данных Источник 9 - nibrs_bias_motivation [55]
Описание: System.Data.Odbc.OdbcException (0x80131937): ОШИБКА [HY000] неизвестная ошибка (7)

в System.Data.Odbc.OdbcConnection.HandleError (OdbcHandle hrHandle, RetCode retcode)
в System.Data.Odbc.OdbcCommand.ExecuteReaderObject (поведение CommandBehavior, метод String, логический NeedReader, Object [] methodArguments, SQL_API odbcApiMethod)
в System.Data.Odbc.OdbcCommand.ExecuteReaderObject (поведение CommandBehavior, метод String, логический needReader)
в System.Data.Odbc.OdbcCommand.ExecuteReader (поведение CommandBehavior)
в System.Data.Odbc.OdbcCommand.ExecuteDbDataReader (поведение CommandBehavior)
в System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (поведение CommandBehavior)
в Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter.PreExecute ()
в Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute (оболочка IDTSManagedComponentWrapper100)

И до того, как эта задача не будет выполнена, использование памяти возрастет до 99%, а затем эта задача не будет выполнена. Это заставило меня думать, что это проблема памяти. Но я не знаю, как я могу решить это.

Я попытался установить для DelayValidation значение true для всех задач потока данных. Ничего не изменилось. Я играл с размерами буфера. Ничего.

Что я могу сделать?

1 Ответ

0 голосов
/ 13 января 2019

Пошаговое руководство

Поскольку ошибка выдается при чтении из большого набора данных, попробуйте прочитать данные по блокам, чтобы добиться того, что вы можете выполнить следующие шаги:

  1. Объявить 2 переменные типа Int32 (@[User::RowCount] и @[User::IncrementValue])
  2. Добавьте Execute SQL Task, который выполняет команду select Count(*), и сохраните набор результатов в переменную @[User::RowCount]

enter image description here

enter image description here

  1. Добавить цикл For со следующими предпочтениями:

enter image description here

  1. Внутри контейнера цикла добавьте Data flow task
  2. Внутри задачи потока данных добавьте ODBC Source и OLEDB Destination
  3. В источнике ODBC выберите опцию SQL Command и напишите SELECT * FROM TABLE запрос * (только для получения метаданных`
  4. Сопоставить столбцы между источником и пунктом назначения
  5. Вернитесь к Control flow, нажмите Data flow task и нажмите F4 , чтобы просмотреть окно свойств
  6. В окне свойств перейдите к выражению и присвойте следующее выражение свойству [ODBC Source].[SQLCommand]: (подробнее см. Как передать переменные SSIS в выражении ODBC SQLCommand? )

    "SELECT * FROM MYTABLE ORDER BY ID_COLUMN
    LIMIT 500000
    OFFSET " + (DT_WSTR,50)@[User::IncrementValue]"
    

Где MYTABLE - имя исходной таблицы, а IDCOLUMN - ваш первичный ключ или столбец идентификации.

Снимок экрана Control Flow

enter image description here

Ссылки

...