Копирование всей большой таблицы 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.
Мой вопрос: есть ли какие-либо методы, которые я могу использовать, или настройки, с которыми я могу играть, чтобы настроить производительность запроса?
- Например, есть ли лучшие способы построения моего SQL-запроса? например, я должен заказать по столбцам в индексе, а не ROWID?
- Должен ли я увеличить размер буфера сообщений в группе серверов 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, используя почти все из исходной базы данных (имя таблицы, поля и индекса, формат и единственное, что имеет быть преобразованным, где типы данных). И я уверен, что это работает и наоборот.