2009-10-17 4 views
0

У меня есть таблица с ~ 30 000 000 строк, которые мне нужно выполнить, чтобы обрабатывать данные для каждой строки отдельно, а затем сохранять данные из строки в файл на локальном диске.Как пропустить все строки в таблице Oracle?

Каков наиболее эффективный способ циклического преобразования всех строк в таблице с использованием SQL для Oracle? Я занимаюсь поиском в Интернете, но не вижу прямого способа сделать это. Пожалуйста помоги. Имейте в виду, что я не знаю точное количество строк, а только оценку.

редактирования.К РАЗЪЯСНЕНИЯ:

Мы используем Oracle 10g я считаю. Данные строки содержат данные blob (zipped текстовые файлы и xml-файлы), которые будут считываться в память и загружаться в пользовательский объект, где он будет затем обновляться/преобразовываться с использованием классов доступа Net, DOM, их перераспределение и сохранение на локальном диске ,

У меня нет большого опыта работы с базами данных - я планировал использовать прямые инструкции SQL с ADO.Net + OracleCommands. На самом деле никаких ограничений по производительности. Это для внутреннего использования. Я просто хочу сделать это наилучшим образом.

+1

Какие манипуляции вам нужно делать с данными? вероятно, вы могли бы сделать это в каком-то запросе, но вы должны дать больше информации. – twolfe18

+0

Вам необходимо предоставить дополнительную информацию. Вы собираетесь использовать PL/SQL, Pro * C или OCI? Или ваши манипуляции достаточно просты, вы можете сделать это в запросе, а затем экспортировать результаты в файл? Более подробная информация даст лучшие ответы. – EvilTeach

+0

Также существуют ограничения производительности? Какую версию оракула вы используете? В каком формате должен находиться выходной файл? Что будет сделано после файла? – EvilTeach

ответ

2

Вам нужно прочитать 30-миллиметровые строки из базы данных Oracle и выписать 30-миллиметровые файлы из BLOB (один zipped XML/текстовый файл в одном столбце BLOB на строку?) В каждой строке в файловую систему на локальном компьютере?

Очевидным решением является ADO.NET DataReader на SELECT * FROM tbl WHERE <range>, поэтому вы можете делать партии. Прочтите BLOB от читателя в ваш API, сделайте свой материал и выпишите файл.Вероятно, я попытаюсь написать программу, чтобы она могла запускаться со многих компьютеров, каждый из которых выполнял свои собственные диапазоны - ваше узкое место, скорее всего, будет расстегивать, манипулировать и перерисовывать, поскольку многие потребители могут, вероятно, передавать данные из этой таблицы из сервер без заметного влияния на производительность сервера.

Я сомневаюсь, что вы сможете сделать это с помощью операций на основе набора, основанных на базе данных Oracle, и я также буду думать о файловой системе и о том, как вы собираетесь организовать так много файлов (и имеете ли вы space - помните, что размер, занимаемый файлом в файловой системе, всегда равен кратности размера блока файловой системы).

+0

Это то, что я имел в виду изначально, я просто хотел проверить с некоторыми с большим опытом. Благодаря! – JimDaniel

1

Вы можете попробовать использовать запросы rownum, чтобы захватить куски, пока вы не захватите кусок, которого не существует.

Это хорошая статья на RowNum запросов: http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

Если вы не чувствуете, как чтение, перейти непосредственно к «PAGINATION с ROWNUM» раздел в конце для примера запроса.

0

Всегда рекомендуется использовать операции с множеством операций при работе с большим количеством строк.

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

Жизнеспособность этого зависит от обработки, которую вам нужно выполнять в строках, хотя в большинстве случаев это позволяет избежать использования цикла. Есть ли какое-то конкретное требование, которое мешает вам обрабатывать все строки сразу?

Если итерация по строкам неизбежна, использование массового привязки может быть полезным: FORALL массовые операции или BULK COLLECT для запросов «выбрать».

0

Мое первоначальное решение было сделать что-то вроде этого, поскольку у меня есть доступ к номеру идентификатора (псевдокод):

  int num_rows = 100; 
      int base = 0; 
      int ceiling = num_rows; 

      select * from MY_TABLE where id >= base and id < ceiling; 
      iterate through retrieved rows, do work, 
      base = ceiling; 
      ceiling += num_rows; 
      select * from MY_TABLE where id >= base and id < ceiling; 
      iterate through retrieved rows, do work, 
      ...etc. 

Но я чувствую, что это не может быть наиболее эффективным и лучшим способом сделать это ...

0

Похоже, вам нужен весь набор данных до, вы можете делать любые манипуляции с данными, так как это BLOB>. Я бы просто использовал DataAdapter.Fill, а затем передал набор данных к пользовательскому объекту, чтобы выполнить итерацию, сделать это манипулирование, а затем записать на диск конечный объект, а затем zip.

+0

Капля каждой строки является независимым zip-файлом, который нуждается в чтении в память, обновлен, затем перерисован и сохранен на локальном диске. Если это так, вы по-прежнему рекомендуете DataAdapter.Fill? – JimDaniel

+0

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

Смежные вопросы