Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> копирование содержимого крупной таблицы по частям, копирование содержимого крупной таблицы  
V
    Опции темы
Alexander06
Дата 24.5.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Здравствуйте.

Использую Java + H2 Database Engine(www.h2database.com).
Есть таблица wordforms в которой кроме ключа еще пара текстовых полей. Число записей - 1 300 000.

Мне необходимо создать другую таблицу, скопировав в нее содержимое первой.
Сделать INSERT INTO newTable(..) SELECT (...) FROM wordforms не получается, вылетает с ошибкой JavaHeapSpace.

Пробовал делать иначе

1. SELECT key FROM wordforms
2. Загоняю все ключи в массив.
3. В цикле по массиву копирую записи в новую таблицу.

Но это тоже плохо - иногда завершается с ошибкой JavaHeapSpace на этапе выполнения запроса.

Подскажите, как можно более оптимально выполнить такое копирование?
PM MAIL   Вверх
Gluttton
Дата 25.5.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Не приходилось сталкиваться с
Цитата

Java + H2 Database Engine(www.h2database.com).


Но в самом общем случае приходит в голову следуюющее...

Для успешного выполнения операции копирования необходимо сократить объем копируемых данных между COMMIT'ами.
Варианты:
1. Уточнить в инструкции к СУБД есть ли что то вроде AUTO COMMIT ON (OFF) или что-то такое...
2. Докупить оперативной памяти и перейти на 64-битрую ОС smile  - это я так шучу. 
3. Разделить "вручную" все данные на группы и произвести копирование в несколько сеансов. При этом группы можно выделять например по значению первичного ключа и тогда с учетом используемого Вами запроса "это" могло бы выглядеть так:

Код

INSERT INTO newTable(..) SELECT (...) FROM wordforms
WHERE wordforms.PrimaryKeyField>=1 and wordforms.PrimaryKeyField<100000

INSERT INTO newTable(..) SELECT (...) FROM wordforms
WHERE wordforms.PrimaryKeyField>=100001 and wordforms.PrimaryKeyField<200000
...
INSERT INTO newTable(..) SELECT (...) FROM wordforms
WHERE wordforms.PrimaryKeyField>=1200001 and wordforms.PrimaryKeyField<1300000


Если БД б/у-шная, то можно увеличить диапазон от 1300000 вверх, для того что бы "захватить" вышедшие за границу ключи. И увеличивать эту границ до тех пор, пока COUNT(*) в новой и старой таблице на станут возвращать одинаковые данные.


--------------------
Слава Україні!
PM MAIL   Вверх
Zloxa
Дата 25.5.2009, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Alexander06 @  24.5.2009,  22:02 Найти цитируемый пост)
одскажите, как можно более оптимально выполнить такое копирование? 

Вы так уже пробовали
Самый оптимальный (единственно нормальный) = INSERT INTO newTable(..) SELECT (...) FROM wordforms.
При этом, по идее, на вызывающую сторону не должно передаваться никакого набора данынх.
От чего у Вас возникает JavaHeapSpace - абсолютно не понятно. ИМХО следует разбираться именно с этим.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 25.5.2009, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Zloxa @  25.5.2009,  01:09 Найти цитируемый пост)
От чего у Вас возникает JavaHeapSpace - абсолютно не понятно.

еще как понятно, зайдя по ссылке www.h2database.com видим - 
Цитата
Welcome to H2, the Java SQL database
  smile
т.е. сам движок БД крутится в JVM.
по этому Alexander06, берем по записи и переливаем в другую таблицу и незабываем освобождать память  smile

Это сообщение отредактировал(а) DimW - 25.5.2009, 07:51
PM MAIL ICQ   Вверх
Alexander06
Дата 25.5.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



точно, H2 -  pure Java.
И переполнение тоже происходит в ней самой.

Я, собственно, потому и хотел запросить все ключи, чтобы по одной все записи перенести...но так не выходит.

Есть какой-то еще способ перебрать все записи в таблице? Мои навыки в SQL не дают мне ответ на этот вопрос.
PM MAIL   Вверх
DimW
Дата 25.5.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Alexander06 @  25.5.2009,  09:52 Найти цитируемый пост)
Есть какой-то еще способ перебрать все записи в таблице? 

что бы перебрать их необходимо получить ИМХО проблема именно в этом, не может H2 разместить в памяти весь получаемый резалт сет.
PM MAIL ICQ   Вверх
Akina
Дата 25.5.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(http://www.h2database.com/html/advanced.html)

Limiting the Number of Rows

Before the result is returned to the application, all rows are read by the database. Server side cursors are not supported currently. If only the first few rows are interesting for the application, then the result set size should be limited to improve the performance. This can be done using LIMIT in a query (example: SELECT * FROM TEST LIMIT 100), or by using Statement.setMaxRows(max).

Large Result Sets and External Sorting

For large result set, the result is buffered to disk. The threshold can be defined using the statement SET MAX_MEMORY_ROWS. If ORDER BY is used, the sorting is done using an external sort algorithm. In this case, each block of rows is sorted using quick sort, then written to disk; when reading the data, the blocks are merged together.

Так что попробуй изменить MAX_MEMORY_ROWS и установить необходимый Statement.setMaxRows().


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Alexander06
Дата 25.5.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



MAX_MEMORY_ROWS по умолчанию стоит 10 000...мне это кажется весьма щадящим размером.
Попробовал устанавливать вручную - не помагает. Наверное в каких-то внутренних процессах происходит нехватка памяти.

Есть подозрение, что эта СУБД не очень хороша для баз размером в несколько Гб.

Спасибо за советы, господа, буду искать альтернативу.
PM MAIL   Вверх
DimW
Дата 26.5.2009, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Alexander06 @  25.5.2009,  19:11 Найти цитируемый пост)
буду искать альтернативу

можете посмотреть в сторону Oracle XE, она бесплатная - http://www.oracle.com/technology/products/...e/xe/index.html
из ощутимых ограничений:
1) один процессор;
2) один гиг оперативы
3) 4 гб данных на HD


PM MAIL ICQ   Вверх
Alexander06
Дата 26.5.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Точно, я как раз к ней прицеливаюсь. 4 Гб мне должно хватитьsmile

Что интересно, правильно ли я понял, что Оракл особых ограничений на использование не налагает (кроме использования для террористов), то есть можно юзать и устанавливать на пользовательские машины будущих пользователей программы?
PM MAIL   Вверх
DimW
Дата 26.5.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Alexander06 @  26.5.2009,  12:45 Найти цитируемый пост)
правильно ли я понял, что Оракл особых ограничений на использование не налагает

на Oracle XE нет.
PM MAIL ICQ   Вверх
Akina
Дата 26.5.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Alexander06, так у тебя задача построить локальное Java-приложение? а тогда какой смысл брать экзотику? может, разумнее использовать более распространённые бесплатные движки? MSDE, Firebird, MySQL...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 26.5.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  26.5.2009,  12:56 Найти цитируемый пост)
а тогда какой смысл брать экзотику?

Потому как оракля, в отличии от перечисленных поделок позволяет не абстрагировать прикладной уровень от данных. ;))


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 26.5.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Вопрос - а нужно ли оно топикстартеру... может, ему упрощение дальнейшей поддержки важнее...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 26.5.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  26.5.2009,  17:14 Найти цитируемый пост)
Вопрос - а нужно ли оно 

Нееее... изначально твой вопрос то был "какой смысл"  smile  А это, уже другой вопрос ;)


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1132 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.