Table Iteration

Feb 07, 2009 15:21


Добрый день!

Java + SpringFramework 2.5 + Oracle

Дана таблица с количеством записей в несколько десятков миллионов штук, у которой есть primary key entity_id number. Так же есть интерфейс:

public interface TableIterator { void processRow(long rowId); }
Вопрос в том, как можно реализовать функцию:

void iterate(String tableName, String ( Read more... )

spring, java, database

Leave a comment

Comments 21

hedin February 7 2009, 12:48:58 UTC
select * from TABLE where id > LAST_ID
and rownum <=1
ORDER BY id asc

Прогнал на большой табличке, жуткой медленной сортировки не происходит. Однако индекс.

Reply

dair_targ_one February 7 2009, 13:06:44 UTC
Спасибо, попробуем.

Reply

hedin February 7 2009, 13:27:54 UTC
Единственное надо понимать, что это не гарантирует проход.

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

Если хотите транзакционности то

select * from TABLE

при создании итератора

и resultSet.next() при каждом next() итератора. И ему тогда никакие параметры не нужны ...

Тут надо будет с транзакциями разобраться акуратно ... понимать что соединение заняли ...

Reply

dair_targ_one February 7 2009, 14:10:06 UTC
Это не проблема, т.к. если в первый раз не прошли, то в следующий раз точно пройдём.

Reply


gaus February 7 2009, 12:49:54 UTC
Первое, что пришло на ум: если pk инкрементальный, то сначала узнать count у таблички, а потом итерировать с нуля до сount-а, предварительно узнавая, есть ли ряд с текущим pk.

Reply

dair_targ_one February 7 2009, 13:05:11 UTC
Это слишком большое количество запросов получится.

Reply

gaus February 7 2009, 13:08:11 UTC
Разумеется :)

Reply


krlz February 7 2009, 13:53:46 UTC
Закройте тег
. Вы мне френдленту порвали.

Reply

dair_targ_one February 7 2009, 14:12:46 UTC
хз. У меня не рвёт. Сейчас убрал автоформатирование и сам сверстал. Если не поможет -- это значит косяки оформления ЖЖ, а не моей вёрстки.

Reply

krlz February 7 2009, 14:14:53 UTC
Сейчас все в порядке. Спасибо.

Reply

rutllant February 8 2009, 21:05:37 UTC
по поводу багов во френдленте лучше писать в support livejournal

Reply


denniskharlamov February 7 2009, 13:58:34 UTC
Загляни ко мне в понед. как прийдешь - сделаем

Reply

dair_targ_one February 7 2009, 14:15:20 UTC
Спасибо за приглашение. Тут проблема скорее даже не в частном случае, а в общем -- как такое более разумно делать. =)

Reply


code_wtf? c8ne February 7 2009, 15:07:38 UTC
Меня сильно смущает постановака задачи. В интерфейсах подразумевается что при итерации будут вытащены все ключи, что будет достаточно долго даже если мудрить с интревалами на сервере. Для каждого ключа будет скорее всего вытаскиваться запись по отдельности (иначе зачем итерировать), что тоже не быстро. И решение о том вытаскивать запись или нет будет приниматься на основе rowId, что тоже обычно проблематично.

За исключением очень редких случаев, любое решение в рамках приведенного интерфейса будет существенно более медленное чем SQL-запросы специфичные для задачи, и будет хорошим примером для code_wtf. Советую обратить внимание хотя бы на hibernate, если SQL смущает.

Reply

Re: code_wtf? dair_targ_one February 7 2009, 15:17:02 UTC
Штука в том, что в данном случае условие по которому нужно вытаскивать нужные записи слишком сложное как для просто sql-запроса, так и для hibernate restrictions.
А задача далеко не real-time.

Reply


Leave a comment

Up