Derby in-memory db: нехватка памяти в операторах select into - - PullRequest
4 голосов
/ 14 декабря 2011

Мне нужно использовать дерби с несколькими огромными столами в проекте. Чтобы повысить производительность, я выбираю идентификаторы документов из трех разных таблиц в одну огромную таблицу для поиска типа документа.

В основном очень простой запрос:

"INSERT INTO DOC_TYPES SELECT DOC_ID, 1 FROM TYPE_A_DOCUMENT"
"INSERT INTO DOC_TYPES SELECT DOC_ID, 2 FROM TYPE_B_DOCUMENT"
"INSERT INTO DOC_TYPES SELECT DOC_ID, 3 FROM TYPE_C_DOCUMENT"

Когда я запускаю это в «нормальном» режиме, когда дерби находится на моем жестком диске, обработка занимает около 1 минуты, и у меня получается около 6,5 миллионов строк в БД (огромно, я знаю ...)

Как бы то ни было, база данных все еще медленно работает на мой вкус, поэтому я пытался запустить все в памяти. К сожалению, даже при размере кучи 4 ГБ (полная БД на моем жестком диске никогда не превышает 1 ГБ), операция довольно быстро приводит к «java / lang / OutOfMemoryError».

Я не вижу альтернативы или обходных путей для решения этой проблемы. Derby не поддерживает материализованные представления и выполнение этого в Java (SELECT, interate resultset, INSERT) займет часы ...

Вы также не можете «упорядочить» оператор, поскольку Derby, похоже, не поддерживает LIMIT.

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

С уважением, Michael

1 Ответ

3 голосов
/ 14 декабря 2011

Вы можете попытаться создать чанки по модулю id, установите второе значение операции по модулю равное количеству чанков (n), которое вам нужно. и повторите сравнение с 0 .. (n-1)

INSERT INTO DOC_TYPES SELECT DOC_ID, 1 FROM TYPE_A_DOCUMENT WHERE DOC_ID % 2 = 0
INSERT INTO DOC_TYPES SELECT DOC_ID, 1 FROM TYPE_A_DOCUMENT WHERE DOC_ID % 2 = 1

и зафиксируйте транзакцию для каждой вставки.

...