Теперь у нас есть база данных firebird с 1.000.000, которая должна обрабатываться после того, как ВСЕ загружаются в ОЗУ. Чтобы получить все эти данные, мы должны извлечь данные с помощью (выберите * first 1000 ...) в течение 8 часов. Какое решение для этого?Как быстро загрузить 1 миллионные записи из базы данных?
ответ
Какую обработку необходимо выполнить, чтобы потребовалось загрузить их в память, а не просто обрабатывать их с помощью операторов SQL?
Есть две техники, которые я использую в этой работе в зависимости от того, что я пытаюсь сделать.
Предполагая, что существует какой-то искусственный ключ (идентификация), работайте партиями, увеличивая обрабатываемое последнее значение идентичности.
BCP данные выводятся в текстовый файл, обмениваются обновлениями, а затем BCP обратно, помня об отключении ограничений и индексов перед шагом IN.
Мы делаем некоторый анализ каждого из db, и нам нужно, чтобы они загружались в память. Узким местом является момент, когда мы переносим данные из набора записей в наши объекты DTO. –
Взгляните на это: http://www.firebirdfaq.org/faq13/
Ничего, что могло бы помочь мне по этой ссылке, возможно, эта проблема встречается во всех базах данных. Мне нужно оптимизировать время для while (read.Read()) ". –
ли каждый из ваших «выбрать * первый 1000» (как вы описали это) сделать полное сканирование таблицы? Посмотрите на эти запросы и убедитесь, что они используют индекс.
Не проблема выбора скорости. Передача данных из выбранного набора записей в память, while (read.Read()) занимает долгое время ... –
для загрузки данных из таблицы с 1.000.000 строк в C# с использованием FIREBIRD дб принимает на Pentium 4 3Ghz по крайней мере 8 часов
Все это предполагали вы запускали запрос SQL для выбора записей из базы данных. Кое-что вроде
select *
from your_big_table
/
Потому что это действительно займет несколько секунд. Ну, немного больше, чтобы отобразить его на экране, но выполнение фактического выбора должно быть молниеносно.
Но эта ссылка на C# заставляет меня думать, что вы делаете что-то еще. Возможно, у вас действительно есть цикл RBAR, создающий миллион объектов. Я вижу, как это может занять немного больше времени. Но даже так, восемь часов? Куда уходит время?
редактировать
Мое предположение было верно, и вы инстанцировании объекты 1000000 цикла. Правильным советом было бы найти другой способ сделать то, что вы делаете, когда у вас есть все ваши объекты в памяти. Не зная подробнее о деталях, трудно дать конкретные детали. Но кажется маловероятным, что это пользовательский интерфейс - какой пользователь собирается просматривать миллион объектов?
Для общего наблюдения должно быть достаточно: использовать массовые операции для осуществления массовой деятельности. Базы данных SQL превосходны при обработке наборов. Используйте мощь SQL для обработки миллионов строк в одном наборе, а не как отдельные строки.
Если вы не найдете этот ответ полезным, вам необходимо предоставить нам более подробную информацию о желании, которого вы пытаетесь достичь.
Наш процесс запускается раз в месяц максимум в худшем случае. И да, мы загружаем все данные из таблицы в большой одиночный цикл. Этот цикл является нашим узким местом. На мгновение я подумывал сделать некоторые клоны БД и теперь запускать несколько параллельных запросов, чтобы быстрее загружать данные. –
Мы никогда не загружаем записи в цикле, когда у вас их много. Это база данных 101. Я не знаю firebird, но большая поддержка базы данных с использованием выбора во вставке, например, insert table2 (field1, field2) select field1, field2 from table1 Это было бы намного быстрее, чем одна строка за раз – HLGEM
Сколько времени требуется, чтобы построить объект DTO, который вы создаете, с каждым чтением данных?
{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); }
Вы создаете миллион этих объектов. Если для создания одного объекта DTO требуется 29 миллисекунд, то для завершения потребуется более 8 часов.
Каков размер стола? вы уверены, что ваша память может удержать это? – zsong
Звучит как работа для ... [Самая быстрая база данных в мире] (http://thedailywtf.com/Articles/Announcing-APDB-The-Worlds-Fastest-Database.aspx)! –
Миллион записей должны быть загружены за считанные секунды, если они не являются действительно огромными записями. Как вы их загружаете? Какую платформу вы используете? –