复制整个大型OpenEdge表

时间:2017-10-20 10:24:32

标签: c# odbc offset openedge ansi-sql-92

我需要找到读取大型OpenEdge表(1亿行以上)的最快方法,最好是以编程方式(在c#中)和ETL工具之外(如SSIS)或暂存格式(如文本文件提取)。

我目前正在使用ODBC(驱动程序:Progress OpenEdge 11.5)使用OFFSET和FETCH修饰符批量查询OpenEdge 11.5表

SELECT COL_1, COL_2
FROM PUB.TABLE_1
ORDER BY ROWID ASC
  OFFSET {currentBatchStart} ROWS
  FETCH NEXT {batchSize} ROWS ONLY

我正在使用FetchArraySize: 25QueryTimeout: -1通过系统DSN进行查询。我正在使用message buffer size: 1024连接到仅为SQL访问设置的OpenEdge服务器组。

我发现性能很差(每15分钟大约有100万条记录),我怀疑它只会在我使用OFFSET FETCH修饰符时进入表格时放慢速度。

我的问题是我可以采用任何方法或我可以使用的设置来调整查询性能吗?

  1. 例如,有更好的方法来构建我的SQL查询吗?例如我应该按索引中的列而不是ROWID来订购吗?
  2. 我应该增加sql server组上的消息缓冲区大小
  3. 或者我应该考虑从表中读取数据的替代方法吗?

    注意:随后将每个批次sqlbulkcopy编入SQL Server表

2 个答案:

答案 0 :(得分:0)

我对ODBC的了解不多 - 从我可以对你的代码做出的事情来看,这会带来越来越多的性能问题,因为当你猜测时,你会更进一步。

我的建议是识别该表上的唯一索引,并使用该索引的键来确定接下来要获得的值。然后你的查询变成这样:

WHERE table.KeyField > LastFieldValueRead 
ORDER BY table.KeyField
FETCH NEXT {batchSize} ROWS ONLY

然后,db引擎可以使用您的字段值来查找偏移量并获取下一个值 - 这将比您现在的性能更高。

如果这将是一个持续关注的问题11.7具有Change Data Capture,用于记录其他地方复制的数据更改,Progress会销售Pro2工具以提供持续的数据复制。

答案 1 :(得分:0)

您应该编写OE代码并通过.net功能连接到SQL Server(如果我在System.Data.SQL中正确记住它)。

我用这种方式编写了一个转换工具,它从SQL Server,Oracle DB,xBase等中读取,并使用原始数据库中的几乎所有内容(表,字段和索引名称,格式和唯一的内容)将它们存储到Progress RDBMS中必须在数据类型转换的东西)。而且我很确定它也可以反过来。