从 Sqlite 读取大量数据到 SQL 服务器在预执行时失败
Reading Huge volume of data from Sqlite to SQL Server fails at pre-execute
我有一个巨大的 (26GB) sqlite 数据库,我想使用 SSIS 将其导入 SQL 服务器。
我已正确设置所有内容。一些数据流正在正常工作并正在导入数据。
数据流很简单。它们仅由来源和目的地组成。
但是当涉及到具有 8000 万行的 table 时,数据流失败并显示以下无用消息:
Code: 0xC0047062
Source: Data Flow Task Source 9 - nibrs_bias_motivation [55]
Description: System.Data.Odbc.OdbcException (0x80131937): ERROR [HY000] unknown error (7)
at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Odbc.OdbcCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter.PreExecute()
at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100 wrapper)
并且在此任务失败之前,内存使用率上升到 99%,然后任务失败。这让我认为这是一个内存问题。但是不知道怎么解决。
我尝试将所有数据流任务的 DelayValidation
设置为 true。没有改变。
我玩了缓冲区大小。没有。
我能做什么?
分步指南
由于读取大型数据集时会抛出错误,请尝试分块读取数据,实现方法如下:
- 声明 2 个
Int32
类型的变量(@[User::RowCount]
和 @[User::IncrementValue]
)
- 添加执行
select Count(*)
命令的Execute SQL Task
并将结果集存储到变量@[User::RowCount]
- 添加具有以下首选项的 For 循环:
- 在 for 循环容器内添加一个
Data flow task
- 在数据流任务中添加一个
ODBC Source
和 OLEDB Destination
- 在 ODBC Source select
SQL Command
选项中编写一个 SELECT * FROM TABLE
查询 *(仅检索元数据`
- 映射源和目标之间的列
- 返回
Control flow
并点击 Data flow task
并按 F4 查看属性 window
在属性 window 中转到表达式并将以下表达式分配给 [ODBC Source].[SQLCommand]
属性:(有关更多信息,请参阅 How to pass SSIS variables in ODBC SQLCommand expression?)
"SELECT * FROM MYTABLE ORDER BY ID_COLUMN
LIMIT 500000
OFFSET " + (DT_WSTR,50)@[User::IncrementValue]"
其中 MYTABLE
是源 table 名称,IDCOLUMN
是您的主键或标识列。
控制流截图
参考资料
- ODBC Source - SQL Server
- How to pass SSIS variables in ODBC SQLCommand expression?
- HOW TO USE SSIS ODBC SOURCE AND DIFFERENCE BETWEEN OLE DB AND ODBC?
- SQLite Limit
我有一个巨大的 (26GB) sqlite 数据库,我想使用 SSIS 将其导入 SQL 服务器。
我已正确设置所有内容。一些数据流正在正常工作并正在导入数据。
数据流很简单。它们仅由来源和目的地组成。
但是当涉及到具有 8000 万行的 table 时,数据流失败并显示以下无用消息:
Code: 0xC0047062
Source: Data Flow Task Source 9 - nibrs_bias_motivation [55]
Description: System.Data.Odbc.OdbcException (0x80131937): ERROR [HY000] unknown error (7)at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Odbc.OdbcCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter.PreExecute()
at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100 wrapper)
并且在此任务失败之前,内存使用率上升到 99%,然后任务失败。这让我认为这是一个内存问题。但是不知道怎么解决。
我尝试将所有数据流任务的 DelayValidation
设置为 true。没有改变。
我玩了缓冲区大小。没有。
我能做什么?
分步指南
由于读取大型数据集时会抛出错误,请尝试分块读取数据,实现方法如下:
- 声明 2 个
Int32
类型的变量(@[User::RowCount]
和@[User::IncrementValue]
) - 添加执行
select Count(*)
命令的Execute SQL Task
并将结果集存储到变量@[User::RowCount]
- 添加具有以下首选项的 For 循环:
- 在 for 循环容器内添加一个
Data flow task
- 在数据流任务中添加一个
ODBC Source
和OLEDB Destination
- 在 ODBC Source select
SQL Command
选项中编写一个SELECT * FROM TABLE
查询 *(仅检索元数据` - 映射源和目标之间的列
- 返回
Control flow
并点击Data flow task
并按 F4 查看属性 window 在属性 window 中转到表达式并将以下表达式分配给
[ODBC Source].[SQLCommand]
属性:(有关更多信息,请参阅 How to pass SSIS variables in ODBC SQLCommand expression?)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN LIMIT 500000 OFFSET " + (DT_WSTR,50)@[User::IncrementValue]"
其中 MYTABLE
是源 table 名称,IDCOLUMN
是您的主键或标识列。
控制流截图
参考资料
- ODBC Source - SQL Server
- How to pass SSIS variables in ODBC SQLCommand expression?
- HOW TO USE SSIS ODBC SOURCE AND DIFFERENCE BETWEEN OLE DB AND ODBC?
- SQLite Limit