Oracle rownum в db2 - архивирование данных Java - PullRequest
1 голос
/ 13 апреля 2010

У меня есть процесс архивации данных в Java, который перемещает данные между DB2 и Sybase.К вашему сведению - это не выполняется в процессе импорта / экспорта, поскольку для каждой таблицы есть несколько условий, доступных во время выполнения, и поэтому этот процесс разработан в Java.

В настоящее время у меня есть один DatabaseReader и DatabaseWriter.определяется для каждой комбинации источника и назначения, так что данные перемещаются в несколько потоков.Я предполагаю, что хотел бы расширить это далее, где я могу иметь несколько DatabaseReader и Multiple DatabaseWriters, определенные для каждой комбинации источника и назначения.

Так, например, если исходные данные имеют около 100 строк, и я определил 10 читателей и 10писатель, каждый читатель прочтет 10 строк и передаст их писателю.Я надеюсь, что процесс даст мне максимальную производительность в зависимости от ресурсов, доступных на сервере [CPU, Memory и т. Д.].

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

Oracle предлагает концепцию rownum, и я думаю, что жизнь там намного проще .... а как насчет db2?Как я могу добиться этого поведения с db2?Есть ли способ сказать, извлечь первые 10 записей, а затем получить следующие 10 записей и так далее?

Есть предложения / идеи?

Версия Db2 - DB2 v8.1.0.144 Fix Pack Num - 16 Linux

Ответы [ 2 ]

0 голосов
/ 29 апреля 2010

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

Просто включите оператор select, затем продолжайте чтение, пока у вас не кончатся данные. На каждом десятом ряду вы можете вызвать писателя. Однако большинство клиентов jdbc будут выполнять такую ​​оптимизацию под прикрытием, так что, вероятно, это будет не лучше, чем вставка строк по одной за раз.

У меня есть сомнения, что многопоточная реализация nieve ускорит процесс, так как целевой движок базы данных выполняет большую часть работы в любом случае, и это будет ограничено записью в журнал и блокировкой, многопоточность которой не помогает (или ухудшает!).

Насколько я вижу, простой однопоточный процесс "select" / "insert" легко превзойдет вашу многопоточную программу. Есть и другие способы оптимизировать это: -

  1. Настройте клиенты базы данных, чтобы сетевые операции были сгруппированы.
  2. Изучите, как вы обрабатываете "COMMIT", чтобы выполнить коммит после каждых 100 вставок.
0 голосов
/ 15 апреля 2010

DB2 действительно поддерживает концепцию rownum. Не зная вашей схемы базы данных, это пример:

SELECT *
FROM (
  SELECT rownumber() OVER (order by column1, column2) AS number, column1, column2
  FROM mytable
) temp
WHERE number BETWEEN 20 AND 30

Здесь подзапрос получает каждую строку в вашей таблице, а функция округления назначается на основе указанного порядка. «Внешний» запрос может использовать число строк, чтобы выбрать строки, которые вы на самом деле хотите для своих пакетов.

...