Как загрузить 1 миллион записей из базы данных быстро?

Теперь у нас есть firebird база данных с 1.000.000, который должен быть обработан, в конце концов, загружаются в Оперативной памяти. Для получения всех тех, мы должны извлечь использование данных (выбор * сначала 1000...) в течение 8 часов. Каково решение для этого?

6
задан Leonard P. 20 April 2010 в 17:10
поделиться

5 ответов

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

Есть два Техники, которые я использую, работают в зависимости от того, что я пытаюсь сделать.

  1. Предполагая, что существует какой-то искусственный ключ (идентификатор), работайте в пакетном режиме, увеличивая последнее обработанное значение идентификатора.

  2. BCP данные передаются в текстовый файл, обрабатывают обновления, затем BCP их обратно, не забывая отключать ограничения и индексы перед шагом IN.

0
ответ дан 17 December 2019 в 02:25
поделиться

Взгляните на это: http://www.firebirdfaq.org/faq13/

0
ответ дан 17 December 2019 в 02:25
поделиться

для загрузки данных из таблицы с 1.000.000 строк в C # с использованием базы данных Firebird требуется Pentium 4 3Ghz как минимум 8 часов

Все предполагали, что вы используете SQL-запрос для выбора записей из базы данных Что-то вроде

select * 
from your_big_table
/

Потому что это действительно займет несколько секунд. Ну, еще немного, чтобы отобразить его на экране, но выполнение фактического выбора должно быть молниеносным.

Но эта ссылка на C # заставляет меня думать, что вы занимаетесь чем-то другим. Возможно, у вас действительно есть цикл RBAR, создающий один миллион объектов. Я понимаю, что это может занять немного больше времени. Но все-таки восемь часов? Куда уходит время?

править

Мое предположение было правильным, и вы создаете 1000000 объектов в цикле. Правильный совет - найти какой-нибудь другой способ делать то, что вы делаете, когда у вас есть все ваши объекты в памяти. Не зная подробностей, трудно дать конкретику. Но кажется маловероятным, что это думает пользовательский интерфейс - какой пользователь будет просматривать миллион объектов?

Таким образом, общего наблюдения должно быть достаточно: используйте массовые операции для реализации массовых действий . Базы данных SQL превосходно обрабатывают наборы. Используйте возможности SQL для обработки миллиона строк в одном наборе, а не в виде отдельных строк.

Если вы не находите этот ответ полезным, сообщите нам более подробную информацию о том, чего вы пытаетесь достичь.

1
ответ дан 17 December 2019 в 02:25
поделиться

Сколько времени нужно, чтобы построить объект DTO, который вы создаете с каждым считыванием данных?

{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); }

Вы создаете миллион таких объектов. Если для создания одного объекта DTO требуется 29 миллисекунд, то это займет более 8 часов.

1
ответ дан 17 December 2019 в 02:25
поделиться

Каждый из ваших "select * first 1000" (как вы это описали) выполняет полное сканирование таблицы ? Посмотрите на эти запросы и убедитесь, что они используют индекс.

4
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: