Копирование всей большой таблицы OpenEdge

Мне нужно найти самый быстрый способ чтения большой таблицы OpenEdge (более 100 миллионов строк), предпочтительно программно (на C#) и вне инструментов ETL, таких как SSIS, или промежуточных форматов, таких как выдержки из текстовых файлов.

В настоящее время я использую ODBC (драйвер: Progress OpenEdge 11.5) для запроса таблиц 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: 25 а также QueryTimeout: -1, И я подключаюсь к группе серверов OpenEdge, настроенной только для доступа SQL с message buffer size: 1024,

Я считаю, что производительность низкая (около 1 миллиона записей каждые 15 минут), и я подозреваю, что она будет только замедляться по мере продвижения по таблице при использовании модификаторов OFFSET FETCH.

Мой вопрос: есть ли какие-либо методы, которые я могу использовать, или настройки, с которыми я могу играть, чтобы настроить производительность запроса?

  1. Например, есть ли лучшие способы построения моего SQL-запроса? например, я должен заказать по столбцам в индексе, а не ROWID?
  2. Должен ли я увеличить размер буфера сообщений в группе серверов sql

Или я должен искать альтернативные методы для чтения данных из таблицы?


Примечание: каждая партия впоследствии sqlbulkcopy 'в таблицу SQL Server

2 ответа

Я не сильно разбираюсь в ODBC - из того, что я могу сделать из вашего кода, это будет увеличивать проблемы с производительностью по мере того, как вы будете продвигаться дальше по таблице, как и предполагаете.

Мое предложение должно заключаться в том, чтобы идентифицировать уникальный индекс в этой таблице и использовать ключи этого индекса, чтобы определить, какие значения получить дальше. Тогда ваш запрос становится примерно таким:

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

Тогда движок БД может использовать значения вашего поля, чтобы найти смещение и получить следующие значения - это будет гораздо более производительным, чем то, что у вас есть сейчас.

Если это будет постоянной проблемой, то в 11.7 есть "Сбор данных изменений" для регистрации изменений данных для репликации в другом месте, а "Прогресс" продает инструмент Pro2 для обеспечения постоянной репликации данных.

Вы должны написать код OE и подключиться к SQL Server через функциональность.net (если я правильно помню, это в System.Data.SQL).

Я написал инструмент преобразования таким способом, который читает из SQL Server, Oracle DB, xBase и других и сохраняет их в СУБД Progress, используя почти все из исходной базы данных (имя таблицы, поля и индекса, формат и единственное, что имеет быть преобразованным, где типы данных). И я уверен, что это работает и наоборот.

Другие вопросы по тегам