复制整个大型OpenEdge表

问题描述:

我需要找到读取大型OpenEdge表(最多1亿行)的最快方式,最好是以编程方式(在c#中)以及ETL工具(如SSIS)或文本等临时格式文件提取。复制整个大型OpenEdge表

我目前使用ODBC(驱动程序:进度OpenEdge 11.5)使用OFFSET和FETCH修饰符

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

我通过系统DSN询问与FetchArraySize: 25QueryTimeout: -1查询分批OpenEdge 11.5表。并且我将连接到一个OpenEdge服务器组,该组设置为仅使用message buffer size: 1024进行SQL访问。

我发现性能很差(每15分钟约有100万条记录),我怀疑它只会减慢,因为我在使用OFFSET FETCH修改器时前进通过表。

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

  1. 例如是否有更好的方法来构建我的SQL查询?例如我应该按索引中的列而不是ROWID排序吗?
  2. 我应该加大对SQL Server组

消息缓冲区的大小或者我应该寻找替代方法来读取数据出表的?


注:每批随后sqlbulkcopy“编入SQL Server表

我没有太多的ODBC - 从我可以让你的代码,这将有增加的性能问题当你猜测的时候,你会进一步下到桌子上。

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

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

然后数据库引擎可以使用您的字段值找到偏移量并得到下一个值 - 这会比你现在有什么更高性能。

如果这将是一个持续关注的问题11.7有更改数据捕获以记录其他数据复制的数据更改,Progress出售Pro2工具以提供持续的数据复制。

+0

谢谢蒂姆,不幸的是我想这个解决方案是数据库不可知的,所以它可以在任何OE数据库上工作。 – Drammy

+0

唯一合理的表现方式是编写一些OE代码。我是这方面的顾问,如果需要的话可以提供帮助。 –