0

我需要找到读取大型 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: 25和的系统 DSN 进行查询QueryTimeout: -1。我正在连接到一个 OpenEdge 服务器组,该服务器组设置为使用message buffer size: 1024.

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

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

  1. 例如,有没有更好的方法来构建我的 SQL 查询?例如,我应该按索引中的列而不是 ROWID 排序吗?
  2. 我应该增加 sql server 组上的消息缓冲区大小吗

或者我应该寻找替代方法来从表中读取数据?


注意:每个批次随后都被sqlbulkcopy编入一个 SQL Server 表中

4

2 回答 2

0

我对 ODBC 的了解并不多——根据我对您的代码的了解,随着您的猜测,随着您在表格中走得更远,这将带来越来越多的性能问题。

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

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

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

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

于 2017-10-20T13:15:45.613 回答
0

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

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

于 2018-03-29T07:59:30.787 回答