Как стать автором
Обновить

Комментарии 10

H2 действительно очень удобен, когда нужно что-то по быстрому продемонстрировать, сделать небольшое хранилище, однако интересно, есть ли кейсы, когда H2 использовался в проде при больших объёмах данных и какого это было? Или никто даже не пытался пробовать?
Как я понимаю, используют в проде Сбербанка, как основную часть технологии SQL запросов в кластерах IMDG Gridgain.

Все-таки H2 больше для тестовых нужд, нужно понимать, что это все-таки не полноценный движок. Он хорош тем, что семантически поддерживает SQLи разных диалектов и может корректно их выполнять.
Мы пробовали использовать H2 1.4.196 в проде в embedded-режиме, и хоть задача и была достаточно простой, но даже на ней стали вылезать проблемы.


  • сразу же нактнулись на deadlock при выполнении: разобрались, засабмитили баг и вроде бы как в следующей версии пофиксили
  • Thead.interrupt() внезапно прибивал сразу весь datasource, если тред в этот момент выполнял запрос
  • странно интегрирован full-text search: старая версия Lucene, один индекс на все таблицы, который полностью перстраивается после каждого alter/create/drop
  • движок SQL более чем примитивный. По сути он в состоянии выполнять только запросы по одной таблице, либо если все лежит в памяти. Если же ваш запрос содержит JOIN или тупо не умещается в памяти (MAX_MEMORY_ROWS), H2 каждый раз создает временную таблицу с промежуточными результатами (а иногда и не одну), с полным набором данных, даже если тебе нужна только одна запись. А при отсутствии индексов этот же запрос может выполняться часами.
  • учитывая вышесказанное limit/offset никак не влияют на выполнение запроса и служат тупо для обрезания финального resultset
  • несмотря на заявленный MVCC, при выполнении "тяжелого" запроса (того, что требует временную таблицу) таблицы жестко блокируются

Мы мигрировали на Postgres за пару часов и с тех пор все тепло и сухо. А вот в тестбенчах и юнитах до сих пор используем H2.

Согласен, что H2 не замена PostgreSQL, планировщик, статистика и алгоритмы сортировок не те! Но для трансформации данных в процессе подходит отлично. Есть особенность — сериализация всех полей, что может быть критично по аллокации временных объектов. С другой стороны SQL самый распространенный DSL обработки данных и «дешевый» для реализации в приложении с описаным подходом. Не надо учить ему команду и аналитиков.
По сути он в состоянии выполнять только запросы по одной таблице, либо если все лежит в памяти. Если же ваш запрос содержит JOIN или тупо не умещается в памяти (MAX_MEMORY_ROWS), H2 каждый раз создает временную таблицу с промежуточными результатами (а иногда и не одну), с полным набором данных, даже если тебе нужна только одна запись.
А есть доказательства, что всё действительно настолько плохо?

Все доказательства у вас полезут в продакше, когда размер таблиц заметно подрастет.
Вот например баг по поводу дедлока:
https://groups.google.com/forum/#!searchin/h2-database/deadlock%7Csort:date/h2-database/wPR5gztLU34/EHMoEEpqBgAJ
Из стектрейса видно, что на больших resultset движок создает на диске временную таблицу, в которую сваливает результаты, а после закрытия resultset ее дропает.
Если интересно, поиграйтесь с солидными (50k+) табличками, джоинами и аналитическими запросами. Много всего интересного повылазит, например неоптимальное использование индексов планировщиком, которое никак не поменять.

НЛО прилетело и опубликовало эту надпись здесь

Xodus быстрее говорят. Если конечно не нужно SQL любой ценой. А для тестов использую postgres в контейнере. Благо докеры почти везде стали стандартом.

>Поражает что в БД есть даже базовая поддержка геофункций
Я бы все-таки на нее не рассчитывал. Приятнее, что есть возможность написать расширение, и оно написано — H2GIS, вот его и стоит использовать. Даже не потому, что базовая плохая, а скорее потому, что плохо описана, а проводить опыты на кошках, чтобы понять, как оно будет работать — себе дороже.
Отличный совет, спасибо за H2GIS. Просто не перестаю удивляться сколько функций в таком крошечном проекте!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации