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

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

У вас указан странный пример запроса, который никак не соответствует заявленному в начале OLAP сценарию использования
select * from T1 inner join T2 on T1.a = T2.a
И неэффективный при большом размере T2 план его выполнения. Разработчик, в условиях возможности использовать дополнительную память, и больших размерах T2 вероятно реализовал бы hash join, что-то вроде

indexed := hashMapByColumn(T2, 'a')
for (row1 : T1)
    for (row2: indexed[row1.a])
        output(row1, row2)

Вероятно у вас просто неудачный пример. Было бы интересно узнать какие варинты выполнения join кроме nested loop умеет выполнять ваша система, и на основе каких критериев выбирается тот или иной вариант выполнения.
Также интересно было бы узнать сравнение скорости с другими решениями - dbms для olap (clickhouse, hp vertica, ...), серверами olap(Mondrian, ...). Если ваше решение оказывается быстрее, была бы интересна аналитика того на каких сценариях и за счёт каких факторов.

В статье дан минимальный пример для понимания нашего подхода к кодогенерации.
Из алгоритмов джойна у нас есть nested loop (в примере), hash join, merge join.

Алгоритмы выбирает оптимизатор, но такие вещи в двух словах тяжело описать. Возможно, со временем напишем отдельную статью на эту тему.

По поводу сравнения с другими решениями - попробую узнать у коллег.

Из статьи непонятно в какой базе используется эта оптимизация
Вы свою пишите реализацию реляционной базы?
А нельзя ли было такую оптимизацию сделать в виде плагина к open-sourse DB?

Нам была нужна СУБД, на которой отчеты, разработанные на платформе 1С:Предприятие, исполнялись бы быстро. Перед тем, как начать разработку, мы рассмотрели несколько вариантов реализации требований проекта. Оптимальным с точки зрения нескольких важных для нас критериев (время реализации решения, поддерживаемость кода, производительность конечного решения и т.д.) было выбрано написание написание собственной In-memory СУБД, "совместимой" с отчетами, разработанными на платформе 1С:Предприятие.

SQL-совместимую in-memory базу данных

А можно уточнить с каким именно стандартом SQL реализована совместимость (SQL-92/99/2003 и т.д.) ?

И насколько полностью поддерживается совместимость со стандартами ? Поддерживаются ли, например, оконные и рекурсивные функции ? Если нет, то каким образом обрабатываются отчеты, которые их используют ?

Поскольку Дата акселератор не является продуктом, предназначенным для использования вне плафтормы 1С:Предприятие, мы не декларируем совместимость с каким-либо конкретным стандартом SQL.
Одно из основных требований к Дата акселератору - уметь испольнять все отчеты, которые работают на поддерживаемых платформой 1С:Предприятие СУБД. Дата акселератор этому требованию соответствует.

уметь испольнять все отчеты, которые работают на поддерживаемых платформой 1С:Предприятие СУБД

То есть я правильно понимаю, что Дата акселератор умеет выполнять все запросы, которые можно выполнить в 1С ?

А на платформе 1С можно делать рекурсивные запросы и оконные функции ?

И можно уточнить, что насчет предагрегаций ? То есть одно дело суммировать что-то на таблице в миллиард записей (пусть и in-memory), а другое дело, когда данные уже преподсчитаны, и расчет идет уже от них, что делает выполнение гораздо быстрее (собственно в чем и смысл OLAP).

То есть я правильно понимаю, что Дата акселератор умеет выполнять все запросы, которые можно выполнить в 1С ?

Дата акселератор умеет выполнять все отчеты, разработанные на платформе 1С:Предприятие.

А на платформе 1С можно делать рекурсивные запросы и оконные функции ?

Такая возможность не предоставляется.

И можно уточнить, что насчет предагрегаций ? То есть одно дело суммировать что-то на таблице в миллиард записей (пусть и in-memory), а другое дело, когда данные уже преподсчитаны, и расчет идет уже от них, что делает выполнение гораздо быстрее (собственно в чем и смысл OLAP).

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

и тут предагрегации не очень работают.

В большинстве OLAP реализаций есть инкрементная загрузка, которая "обновляет" предагрегации.

Но в целом, а чем глобальное преимущество Дата акселератора перед асинхронной репликой PostgreSQL, на сервере которого shared_buffers столько, что вся база влазит в память (при необходимости ее можно прогреть) ? Вы проводили какие-нибудь тесты для сравнения ? За счет чего достигается ускорение на порядок (ведь у PostgreSQL в таком случае тоже обращение к диску не идет).

И как решается проблема с целостностью транзакций и БД ? Когда идет синхронизация БД нет ли блокировок на основном сервере и Дата акселераторе ?

За счет чего достигается ускорение на порядок:

  • другой способ обработки запросов, отказ от итерационной модели Volcano (например, тут https://habr.com/ru/company/badoo/blog/461699/)

  • компиляция кода для крупных блоков исполнения, т.е. большего количества вложеных циклов - предмет данной статьи

  • поколоночная модель хранения данных

Про целостность данных - насколько знаю, копируются только закоммиченые данные. Уточню у коллег.

За счет чего достигается ускорение на порядок:

Если честно, то не очень понимаю как конкретно эти оптимизации могут ускорить выполнение на порядок по сравнению с PostgreSQL, но все может быть. Но это же легко проверить и показать. Просто делаете SELECT SUM(...) FROM ... GROUP BY ... на PostgreSQL (с предварительно прогретыми буферами) и в Дата акселераторе.

И показываете : вот в PostgreSQL - 10 секунд, а в Дата акселераторе - 1 секунда. Вы же, наверняка, это делали. Просто иначе может оказаться, что свой код то вы оптимизировали, но по итогу он все равно медленнее тех же оптимизаций PostgreSQL (там кстати тоже есть JIT-compiler с использованием LLVM). Не окажется ли, что вы, как всегда, изобретали велосипед ?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий