Pull to refresh

Comments 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+) табличками, джоинами и аналитическими запросами. Много всего интересного повылазит, например неоптимальное использование индексов планировщиком, которое никак не поменять.

UFO just landed and posted this here

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

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

Articles