Как быстро загрузить 1 миллион записей из базы данных? - PullRequest
6 голосов
/ 20 апреля 2010

Теперь у нас есть база данных Firebird с 1.000.000, которая должна быть обработана после загрузки ВСЕ в оперативную память. Чтобы получить все это, мы должны извлечь данные, используя (выберите * первые 1000 ...) в течение 8 часов. Какое решение для этого?

Ответы [ 5 ]

4 голосов
/ 20 апреля 2010

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

1 голос
/ 20 апреля 2010

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

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

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

1 голос
/ 20 апреля 2010

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

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

select * 
from your_big_table
/

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

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

редактировать

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

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

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

0 голосов
/ 20 апреля 2010

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

0 голосов
/ 20 апреля 2010

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

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

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

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

...