![]() |
|
Модераторы: skyboy |
![]()
|
|
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 на этапе выполнения запроса. Подскажите, как можно более оптимально выполнить такое копирование? |
|||
|
||||
| Gluttton |
|
||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
Не приходилось сталкиваться с
Но в самом общем случае приходит в голову следуюющее... Для успешного выполнения операции копирования необходимо сократить объем копируемых данных между COMMIT'ами. Варианты: 1. Уточнить в инструкции к СУБД есть ли что то вроде AUTO COMMIT ON (OFF) или что-то такое... 2. Докупить оперативной памяти и перейти на 64-битрую ОС 3. Разделить "вручную" все данные на группы и произвести копирование в несколько сеансов. При этом группы можно выделять например по значению первичного ключа и тогда с учетом используемого Вами запроса "это" могло бы выглядеть так:
Если БД б/у-шная, то можно увеличить диапазон от 1300000 вверх, для того что бы "захватить" вышедшие за границу ключи. И увеличивать эту границ до тех пор, пока COUNT(*) в новой и старой таблице на станут возвращать одинаковые данные. -------------------- Слава Україні! |
||||
|
|||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Вы так уже пробовали Самый оптимальный (единственно нормальный) = INSERT INTO newTable(..) SELECT (...) FROM wordforms. При этом, по идее, на вызывающую сторону не должно передаваться никакого набора данынх. От чего у Вас возникает JavaHeapSpace - абсолютно не понятно. ИМХО следует разбираться именно с этим. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 4 Всего: 44 |
еще как понятно, зайдя по ссылке www.h2database.com видим -
т.е. сам движок БД крутится в JVM. по этому Alexander06, берем по записи и переливаем в другую таблицу и незабываем освобождать память Это сообщение отредактировал(а) DimW - 25.5.2009, 07:51 |
|||
|
||||
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
точно, H2 - pure Java.
И переполнение тоже происходит в ней самой. Я, собственно, потому и хотел запросить все ключи, чтобы по одной все записи перенести...но так не выходит. Есть какой-то еще способ перебрать все записи в таблице? Мои навыки в SQL не дают мне ответ на этот вопрос. |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 4 Всего: 44 |
||||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Так что попробуй изменить MAX_MEMORY_ROWS и установить необходимый Statement.setMaxRows(). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
MAX_MEMORY_ROWS по умолчанию стоит 10 000...мне это кажется весьма щадящим размером.
Попробовал устанавливать вручную - не помагает. Наверное в каких-то внутренних процессах происходит нехватка памяти. Есть подозрение, что эта СУБД не очень хороша для баз размером в несколько Гб. Спасибо за советы, господа, буду искать альтернативу. |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 4 Всего: 44 |
можете посмотреть в сторону Oracle XE, она бесплатная - http://www.oracle.com/technology/products/...e/xe/index.html из ощутимых ограничений: 1) один процессор; 2) один гиг оперативы 3) 4 гб данных на HD |
|||
|
||||
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Точно, я как раз к ней прицеливаюсь. 4 Гб мне должно хватить
Что интересно, правильно ли я понял, что Оракл особых ограничений на использование не налагает (кроме использования для террористов), то есть можно юзать и устанавливать на пользовательские машины будущих пользователей программы? |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 4 Всего: 44 |
||||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Alexander06, так у тебя задача построить локальное Java-приложение? а тогда какой смысл брать экзотику? может, разумнее использовать более распространённые бесплатные движки? MSDE, Firebird, MySQL...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Потому как оракля, в отличии от перечисленных поделок позволяет не абстрагировать прикладной уровень от данных. ;)) -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Вопрос - а нужно ли оно топикстартеру... может, ему упрощение дальнейшей поддержки важнее...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Нееее... изначально твой вопрос то был "какой смысл" -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |