зависит ли производительность базы данных в памяти от того, написана ли она на c++ или java

Мы пытаемся найти базу данных в памяти с поддержкой индексов, которую мы можем использовать для нашего приложения. Присматриваемся к Aerospike, Apache Ignite, Geode, Voltdb. Особого отличия нет, и каждый утверждает, что работает быстро и имеет отличную поддержку сообщества.

Из них Aerospike и VoltDB основаны на C/C++, а Apache Ignite и Geode основаны на Java.

Учитывая, что выбор между базами данных с точки зрения производительности невелик, и, кроме того, сложно проверить, какая база данных будет работать для нас лучше в производстве, я пытался выяснить, будет ли производительность базы данных в памяти также зависеть от того, будет ли она основан на Java или C/С++. Учитывая, что проблемы со сборкой мусора возникают довольно часто, и его сложно правильно настроить для вашего варианта использования (который может измениться через некоторое время), правда ли, что базы данных на основе Java будут в невыгодном положении.

Спасибо


person Tuco    schedule 19.04.2017    source источник


Ответы (3)


Вы не можете сделать вывод, что одна база данных быстрее другой только потому, что она написана на языке X, а не на языке Y. База данных — очень сложный продукт с множеством функций. Некоторые запросы могут быть быстрее в одной БД, другие запросы в другой БД.

Единственный способ узнать это — протестировать ваш конкретный вариант использования.

person Pavel Tupitsyn    schedule 19.04.2017
comment
Я почти уверен, что язык не имеет значения, но имя базы данных может сказать нам, насколько она горячая (быстрая) :) - person Randoom; 19.04.2017
comment
спасибо, но проверить, что произойдет в производственной среде с миллионами элементов со всеми базами данных, сложно. - person Tuco; 19.04.2017
comment
Да. Такова жизнь. - person Pavel Tupitsyn; 19.04.2017
comment
Я склонен согласиться с этим ответом. Верно также и то, что сборка мусора в Java может оказать влияние. Тестирование с несколькими миллионами записей на небольшом (2-3 узла) кластере не должно быть таким болезненным. Aerospike предоставляет простые инструменты для тестирования. Павел прав, что результат будет зависеть от нагрузки. Я уверен, что для небольших записей (несколько килобайт) со смешанными рабочими нагрузками чтения (простой поиск значения ключа)/записи Aerospike вас не разочарует! (Я работаю в Aerospike). - person Meher; 19.04.2017
comment
Вы правы, но в определенных ситуациях, таких как сборка мусора, база данных, написанная на Java, обязательно покажет язык, на котором она основана, даже если вы используете супер-пупер нестандартную JVM. - person Ronen Botzer; 21.04.2017
comment
@RonenBotzer Некоторые базы данных Java, такие как Ignite, хранят данные в неуправляемой (вне кучи) памяти, чтобы избежать затрат на GC. - person Pavel Tupitsyn; 21.04.2017

Для БД в памяти, которая поддерживает согласованность, как это делает Geode (т. е. выполняет синхронную репликацию на другие узлы перед выпуском клиентского потока), ваша сеть будет более серьезной проблемой, чем компилятор точки доступа. Тем не менее, вот две точки ввода, которые помогут вам понять, где язык не имеет значения:

1) Если вы делаете много операций создания/обновления поверх чтения: используйте память вне кучи на сервере. Это сводит к минимуму GC.

2) Используйте сопоставление сериализации Geode между объектами C/C++ и Java, чтобы избежать JNI. В частности, используйте DataSerializer http://gemfire.docs.pivotal.io/geode/developing/data_serialization/gemfire_data_serialization.html Если вы планируете широко использовать запросы, а не get/puts, используйте PDXSerializer: http://gemfire.docs.pivotal.io/geode/development/data_serialization/use_pdx_serializer.html

person Wes Williams    schedule 19.04.2017

Я предполагаю, что я собираюсь быть противоположным.

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

Будучи написанным на C/C++, eXtremeDB (продукт моей компании) может полностью избежать использования управления памятью во время выполнения C. Полное управление областью памяти в программном обеспечении базы данных позволяет использовать высокоэффективные и специализированные менеджеры памяти и устраняет возможность утечек памяти (с точки зрения всей системы, например, если 200 ГБ отведено для базы данных в памяти). , он никогда не превысит 200 ГБ). eXtremeDB не уникальна в этом отношении; другие СУБД с оперативной памятью, написанные на C/C++, также могут избежать операций malloc/free во время выполнения C или new/delete C++. Так что, пожалуйста, не обвиняйте меня в том, что я делаю презентацию продукта, это не так. Я указываю на возможность, которая возможна с реализацией C/C++, но может быть недоступна с JVM.

Другие ответчики правы: дрянная реализация плана выполнения SQL для данного запроса может свести на нет любое преимущество скомпилированного кода по сравнению с JVM, но в какой-то момент вы должны быть уверены, что ваш поставщик СУБД знает, что они делают ( и заинтересованы в улучшении своего продукта, если план явно неэффективен/неправилен). Если вы не используете SQL, то качество/плохость оптимизатора SQL не является частью уравнения, и на самом деле это зависит от того, насколько хорошо написаны методы индексирования системы баз данных, а также от наличия различных типов индексов для различных требований поиска. (например, хэш-индекс, как правило, лучше, чем b-дерево, для поиска с точным соответствием, но хэш-индекс не может поддерживать поиск с частичным ключом (шаблоном) или упорядоченный поиск).

Есть несколько общедоступных (независимых, проверенных) тестов, на которые вы можете обратить внимание. Мы участвовали в нескольких STAC-M3, хотя только одна другая СУБД также участвовала (в частности, СУБД, которую вы перечислили, не участвовала).

person Steven Graves    schedule 19.04.2017
comment
Продукты на основе Java (такие как Apache Ignite) также используют неуправляемую память, чтобы избежать накладных расходов на GC. скомпилированный код работает быстрее, чем JVM — JVM также выполняет скомпилированный код. Да, в некоторых случаях C++ позволяет писать более быстрый код, чем Java. Но это не значит, что весь код на C++ должен быть быстрее. Очень интересная серия блогов о том, насколько простая программа на C# работает быстрее, чем простая программа на C++: blogs.msdn.microsoft.com/jonathanh/2005/05/20/ - person Pavel Tupitsyn; 20.04.2017