Теперь у нас есть firebird база данных с 1.000.000, который должен быть обработан, в конце концов, загружаются в Оперативной памяти. Для получения всех тех, мы должны извлечь использование данных (выбор * сначала 1000...) в течение 8 часов. Каково решение для этого?
Какой вид обработки вам потребуется, чтобы загрузить их в память, а не просто обрабатывать их с помощью операторов SQL?
Есть два Техники, которые я использую, работают в зависимости от того, что я пытаюсь сделать.
Предполагая, что существует какой-то искусственный ключ (идентификатор), работайте в пакетном режиме, увеличивая последнее обработанное значение идентификатора.
BCP данные передаются в текстовый файл, обрабатывают обновления, затем BCP их обратно, не забывая отключать ограничения и индексы перед шагом IN.
для загрузки данных из таблицы с 1.000.000 строк в C # с использованием базы данных Firebird требуется Pentium 4 3Ghz как минимум 8 часов
Все предполагали, что вы используете SQL-запрос для выбора записей из базы данных Что-то вроде
select *
from your_big_table
/
Потому что это действительно займет несколько секунд. Ну, еще немного, чтобы отобразить его на экране, но выполнение фактического выбора должно быть молниеносным.
Но эта ссылка на C # заставляет меня думать, что вы занимаетесь чем-то другим. Возможно, у вас действительно есть цикл RBAR, создающий один миллион объектов. Я понимаю, что это может занять немного больше времени. Но все-таки восемь часов? Куда уходит время?
править
Мое предположение было правильным, и вы создаете 1000000 объектов в цикле. Правильный совет - найти какой-нибудь другой способ делать то, что вы делаете, когда у вас есть все ваши объекты в памяти. Не зная подробностей, трудно дать конкретику. Но кажется маловероятным, что это думает пользовательский интерфейс - какой пользователь будет просматривать миллион объектов?
Таким образом, общего наблюдения должно быть достаточно: используйте массовые операции для реализации массовых действий . Базы данных SQL превосходно обрабатывают наборы. Используйте возможности SQL для обработки миллиона строк в одном наборе, а не в виде отдельных строк.
Если вы не находите этот ответ полезным, сообщите нам более подробную информацию о том, чего вы пытаетесь достичь.
Сколько времени нужно, чтобы построить объект DTO, который вы создаете с каждым считыванием данных?
{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); }
Вы создаете миллион таких объектов. Если для создания одного объекта DTO требуется 29 миллисекунд, то это займет более 8 часов.
Каждый из ваших "select * first 1000" (как вы это описали) выполняет полное сканирование таблицы ? Посмотрите на эти запросы и убедитесь, что они используют индекс.