MySqlDataAdapter или MySqlDataReader для массовой передачи? - PullRequest
1 голос
/ 05 мая 2010

Я использую соединитель MySql для .NET для копирования данных с серверов MySql в SQL Server 2008.

Кто-нибудь испытал лучшую производительность, используя одно из следующих, по сравнению с другим?

  • DataAdapter и вызов Fill для DataTable кусками 500
  • DataReader.Read для DataTable в цикле 500

Затем я использую SqlBulkCopy для загрузки 500 строк DataTable, затем продолжаю цикл, пока набор записей MySql не будет полностью передан.

В первую очередь меня интересует использование разумного объема памяти и быстрое завершение работы.

Буду признателен за любую помощь!

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

Я использовал SqlBulkCopy с DataReader при обработке больших объемов данных.Я обнаружил, что этот процесс довольно эффективен с точки зрения скорости и использования памяти, поскольку весь набор данных не извлекается до копирования.Я рекомендую установить для свойства BatchSize какое-то разумное значение, например, 500 в вашем случае.

2 голосов
/ 05 мая 2010

Я не использовал SqlBulkCopy, но, как правило, DataReaders обычно предлагает лучшую производительность.

DataReader может быть обработан, пока базовый запрос все еще возвращает записи (поэтому вам не нужно ждать завершения запроса, прежде чем вы сможете начать обработку данных). DataReader вернет данные, как только они станут доступными, и я верю, что по умолчанию будет сохраняться только активная запись в памяти (а не полный набор результатов), что сокращает использование памяти.

DataAdapter загружает полный набор результатов в DataTable / DataSet, который будет иметь более высокие издержки из-за того, как информация хранится в памяти, и дополнительного связанного состояния (например, состояния строки и т. Д.).

Если я только читаю данные, я всегда буду использовать DataReader поверх DataAdapter ... кто-нибудь, пожалуйста, исправьте меня, если я ошибаюсь в какой-либо точке?

Несмотря на это, SqlBulkCopy, похоже, выполняет итерацию только по записям и не использует DataTable для каких-либо оптимизаций (согласно Reflector), поэтому я думаю, что DataReader - ваш лучший выбор.

...