2010-04-20 3 views
6

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

+0

Каков размер стола? вы уверены, что ваша память может удержать это? – zsong

+2

Звучит как работа для ... [Самая быстрая база данных в мире] (http://thedailywtf.com/Articles/Announcing-APDB-The-Worlds-Fastest-Database.aspx)! –

+0

Миллион записей должны быть загружены за считанные секунды, если они не являются действительно огромными записями. Как вы их загружаете? Какую платформу вы используете? –

ответ

0

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

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

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

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

+0

Мы делаем некоторый анализ каждого из db, и нам нужно, чтобы они загружались в память. Узким местом является момент, когда мы переносим данные из набора записей в наши объекты DTO. –

0

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

+0

Ничего, что могло бы помочь мне по этой ссылке, возможно, эта проблема встречается во всех базах данных. Мне нужно оптимизировать время для while (read.Read()) ". –

4

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

+0

Не проблема выбора скорости. Передача данных из выбранного набора записей в память, while (read.Read()) занимает долгое время ... –

1

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

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

select * 
from your_big_table 
/

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

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

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

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

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

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

+0

Наш процесс запускается раз в месяц максимум в худшем случае. И да, мы загружаем все данные из таблицы в большой одиночный цикл. Этот цикл является нашим узким местом. На мгновение я подумывал сделать некоторые клоны БД и теперь запускать несколько параллельных запросов, чтобы быстрее загружать данные. –

+2

Мы никогда не загружаем записи в цикле, когда у вас их много. Это база данных 101. Я не знаю firebird, но большая поддержка базы данных с использованием выбора во вставке, например, insert table2 (field1, field2) select field1, field2 from table1 Это было бы намного быстрее, чем одна строка за раз – HLGEM

1

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

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

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