我需要找到读取大型OpenEdge表(1亿行以上)的最快方法,最好是以编程的方式(在c#中)和在诸如SSIS之类的ETL工具之外,或者像文本文件摘录这样的暂存格式之外。
我目前正在使用ODBC (驱动程序: OpenEdge 11.5)使用偏移量和获取修饰符批量查询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: 25和QueryTimeout: -1通过系统DSN查询。我正在连接到一个为SQL而设置的OpenEdge服务器组( message buffer size: 1024 )。
我发现性能很差(大约每15分钟就有100万条记录),我怀疑当我使用偏移量获取修饰符时,它只会慢下来。
我的问题是,我是否可以采用任何方法或设置来调整查询性能?
还是我应该考虑其他方法来从表中读取数据?
注意:每个批处理随后都会被sqlbulkcopy_‘编辑成Server表
发布于 2017-10-20 13:15:45
我不太了解ODBC --根据我对您的代码所能做的,这将带来越来越多的性能问题,就像您推测的那样。
我的建议是确定该表上的唯一索引,并使用该索引的键来确定下一步要获取的值。然后,您的查询变成如下所示:
WHERE table.KeyField > LastFieldValueRead
ORDER BY table.KeyField
FETCH NEXT {batchSize} ROWS ONLY然后db引擎可以使用您的字段值来查找偏移量并获得下一个值--这将比现在的性能要好得多。
如果这将是一个持续关注的问题,那么11.7已经有了用于记录数据更改以便在其他地方复制的更改数据捕获,并且进步公司出售Pro2工具来提供数据的持续复制。
发布于 2018-03-29 07:59:30
您应该编写OE代码,并通过.net功能连接到Server (如果我正确记得它在System.Data.SQL中的话)。
我用这种方式编写了一个转换工具,它从Server、Oracle、xBase和其他数据库中读取,并使用原始数据库中的几乎所有内容(表、字段和索引名称、格式以及数据类型必须转换的唯一内容)将它们存储到进度关系数据库中。而且我很肯定它也是相反的。
https://stackoverflow.com/questions/46847135
复制相似问题